cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Daniel Kulp <dk...@apache.org>
Subject Re: "Around" interceptor
Date Mon, 22 Sep 2008 18:38:59 GMT
On Sunday 21 September 2008 8:13:54 am Quilleash, Michael (IT) wrote:
> Thanks for the reply Ian.
>
> I did see this approach being used by the default interceptors, however I
> found out that the out/outFault messages are always null when the "in"
> interceptor is invoked so the interceptor chains aren't available to add
> new interceptors to.
>
> I haven't found an example of any interceptors that add interceptors to
> different interceptor chains.

Yea, that's very hard to do.  The chains aren't created until they are 
actually needed.   In a "one way" case, there would never even be an "out" 
chain created or called.

On the server side, the "simple" way to do it is to add your "stop" 
interceptor to the VERY VERY end of the chain.   If there is an out message, 
the last interceptor on the "in" chain is the one that sets up the out 
message/chain and calls it.   Thus, your interceptor would be invoked after 
that.   

Dan


> Is there a way of doing what you are saying, perhaps by creating the out
> messages earlier?
>
> Cheers.
>
> -----Original Message-----
> From: Ian Roberts [mailto:i.roberts@dcs.shef.ac.uk]
> Sent: 21 September 2008 12:50
> To: users@cxf.apache.org
> Subject: Re: "Around" interceptor
>
> Quilleash, Michael (IT) wrote:
> > I would need to have:
> >
> > In Interceptor - start timing
> > Out/InFault/OutFault interceptors - stop timing
> >
> > To catch all the possible code paths.  Is there any easier way of
> > doing this?
>
> A trick used in a number of CXF built-in interceptors is to have a main
> interceptor which is added to the chain explicitly, but then have that
> interceptor add others to the relevant chains for that exchange during its
> handleMessage.  For example (pseudo-code):
>
> class TimingInterceptor {
>   private Interceptor stopTiming = new StopTimingInterceptor();
>
>   handleMessage(Message m) {
>     Exchange ex = m.getExchange();
>     ex.put("startTime", System.currentTimeMillis());
>     ex.getOutMessage().getInterceptorChain().add(stopTiming);
>     ex.getOutFaultMessage().getInterceptorChain().add(stopTiming);
>   }
>
>   static class StopTimingInterceptor {
>     handleMessage(Message m) {
>       Exchange ex = m.getExchange();
>       long startTime = ex.get("startTime");
>       // ...
>     }
>   }
> }
>
> You only need to add the TimingInterceptor to your input chain and it will
> manage the rest for you.
>
> Ian
>
> --
> Ian Roberts               | Department of Computer Science
> i.roberts@dcs.shef.ac.uk  | University of Sheffield, UK
> --------------------------------------------------------
>
> NOTICE: If received in error, please destroy and notify sender. Sender does
> not intend to waive confidentiality or privilege. Use of this email is
> prohibited when received in error.



-- 
Daniel Kulp
dkulp@apache.org
http://www.dankulp.com/blog

Mime
View raw message