> -----Original Message-----
> From: Polar Humenn [mailto:[EMAIL PROTECTED]
> Sent: Friday, February 09, 2007 12:20 AM
> To: [email protected]
> Subject: Re: Proposal for chaning CXF Interceptor APIs. WAS: RE: When
> should we close the handlers in CXF?
>
>
> Liu, Jervis wrote:
> > You are right in saying statelessness is only a sufficient
> condition. But I would say it is recommended that the CXF
> interceptors are implemented as statelessness unless the
> developer are fully aware of the implication of writing a
> stateful interceptor as our current interceptor calling
> semantics are not enough to guarantee thread safety in this case.
> >
> Exactly, so the call semantics have to be nailed down, documented and
> adhered to. What are the intended invariants on each call?
> >> ....
> >>
> >> I don't like the idea of an onFinish(Message) because it
> >> requires me to
> >> *wait* in my interceptor to make sure that my message
> popped out the
> >> other end. The handleFault() which is the result of an
> interceptor
> >> thrown Fault, gives me the "exception" to my *assumption* that the
> >> message will pop out the other end. Assuming messages make it
> >> out or in
> >> is the most abundant normal case.
> >>
> >>
> >
> > onFinish() was proposed to address the subchain issue,
> i.e., we want the interceptor has the capability to register
> some sort of terminal actions with the InterceptorChain to be
> executed when the chain traversal is complete, more details
> on this discussion can be found from [1] [2] [3]. onFinish is
> not designed to address fault handling issues.
> >
> Okay, so I read what was below. I was not yet familiar with
> the subChain
> semantics, but now I am getting it. I see some problems with the
> subChain semantics (which are below), and I almost grasp what you are
> looking for, which may alleviate my concerns, so please
> correct me if
> am totally off base.
>
> The goal of an outbound message is to get from the
> application to the wire,
>
> Application ----> Wire
>
> is it not? Interceptor traversal happens on that arrow. An
> interceptor
> chain is NOT *finished* until that message is out on the
> wire, (unless
> some fault occurs). Correct?
>
> Application ---- InterceptorChainTraversal ----> Wire
>
> The basic requirement you are looking for is to have some backward
> actions planned after the chain is traversed in one direction
> to do some
> clean up, or write end messages, trade output streams, in the
> backward
> direction. Correct?
>
Correct
> I understand from your explanation of the SoapOutHandler
> interceptor in
> [1], than on the proposed onFinish() call that the message hasn't yet
> been written to the wire, but is about to be written (after adding
> ending tags, etc). Finally the at the end the
> MessageSenderInterceptor
> calls the "conduit.close(message)", which I presume actually
> writes the
> message out on the wire.
>
> I surmise that the interceptor chain is NOT *finished* at the last
> interceptor in the chain, because the intended goal of the
> interceptor
> chain is to get the message out on the wire, and that has not been
> achieved.
>
> I believe you really want is to describe a two phase interceptor
> traversal to *complete* the chain. I realize the the execution trace
> would be the same, yet the proverbial semantics are subtly different
> (maybe suggesting different name for the operations).
>
> For an interceptor chain of A,B,C,D we would get the
> following execution.
>
> Application ---- A, B, C, D, D, C, B, A -> Wire
>
> Is this the trace you intend?
Exactly
> I suggest on the backward trace
> that the
> interceptor is still "handling" the message. Therefore, I
> would suggest
> different names.
>
> interface Interceptor<T extends Message> {
> void handleMessageP1(T message);
> void handleMessageP2(T message);
> // fault handing is another topic.
> }
>
> Where P1 and P2 distinguish the "forward" phase and the "backward"
> phase of message handling, respectively. Suggestions?
>
So we are now very close to reach an agreement. what I proposed originally are:
interface Interceptor<T extends Message> {
void handleMessage(T message);
void onComplete(T message);
}
Actually the onComplete and handleMessageP2 are used under exact same
semantics, just the meaning suggested by the name has a little bit different
focus. The name of onComplete is more about the capability of registering a
terminal action with the InterceptorChain to be executed when the chain
traversal is complete, while handleMessageP2 more concerns about the "backward"
message traverse path. I would say they are both correct, just different angles
to look at the problem.
> Now, for my concerns about the subchain logic;
>
> The doInterceptInSubChain and finishSubChain is a way for two
> interceptors to communicate (that coordinated with each
> other), yet have
> the unknowing possibly of being subverted by other injected
> interceptors
> in unfortunate places that call doInterceptSubChain and
> finishSubChain
> as well, and thereby two seemingly coordinated interceptors are
> mis-coordinated.
>
> I surmise that this approach will eliminate the need
> for"doInterceptSubChain" and "finishSubChain" calls, and also will
> eliminate ability to call "doIntercept" for anything but the CXF
> internal processing (i.e. interceptors cannot call it).
>
Yes, with the onComplete or handleMessageP2 method, we wont need the calling of
doInterceptSubChain or doIntercept anymore.
> > As far as the fault handling is concerned, I agree with you
> that our current fault handling logics are bit confusing.
> This has been raised by Eoghan couple months ago, see [4].
> Can I suggest we separate this thread into two topics? One is
> the proposal of adding onFinish() into interceptor interface,
> which is to address subchain and terminal actions issues. One
> is about the fault handling. For the former, I would like to
> see if there are any objections? If there is no different
> voice, at least we can start working on this and keep our
> discussion for the later going until it is fully baked.
> >
> I agree. We should discuss on another thread.
>
> Cheers,
> -Polar
> > [1].
> http://mail-archives.apache.org/mod_mbox/incubator-cxf-dev/200
> 701.mbox/[EMAIL PROTECTED]
> ONAGLOBAL.COM%3e
> > [2].
> http://mail-archives.apache.org/mod_mbox/incubator-cxf-dev/200
> 701.mbox/[EMAIL PROTECTED]
> ONAGLOBAL.COM%3e
> > [3].
> http://mail-archives.apache.org/mod_mbox/incubator-cxf-dev/200
> 701.mbox/[EMAIL PROTECTED]
> na.com%3e
> > [4]
> http://mail-archives.apache.org/mod_mbox/incubator-cxf-dev/200
> 611.mbox/[EMAIL PROTECTED]
> ublin.emea.iona.com%3e
> >
> >
> >> Unfortunately, after a discussion with Eoghan, I find that some
> >> interceptor chains are just not completed. If that is the
> >> case, when or
> >> if would you call "onFinish()"?
> >>
> >> I would suggest:
> >>
> >> void handleMessage(Message m) throws Fault;
> >>
> >> void handleFault(
> >> Message m, String phase, String interceptor, Fault f
> >> );
> >>
> >> naming the phase and interceptor that threw the particular fault.
> >> or maybe even
> >>
> >> class InterceptorFault {
> >> String phase; String interceptor; Fault fault;
> >> }
> >> void handleFault(
> >> Message m, List<InterceptorFault> faults
> >> ) throw Fault;
> >>
> >> which allows handleMessage to throw a fault, and
> >> handleFault() to throw
> >> Faults, but is given a list of faults and the names of
> >> interceptors that
> >> throw them back along the way. The chain collects Faults
> and adds the
> >> faults to the list.
> >>
> >> Cheers,
> >> -Polar
> >>
> >> Liu, Jervis wrote:
> >>
> >>> Hi Polar, comments in-line.
> >>>
> >>> Cheers,
> >>> Jervis
> >>>
> >>>
> >>>
> >>>> -----Original Message-----
> >>>> From: Polar Humenn [mailto:[EMAIL PROTECTED]
> >>>> Sent: 2007?2?7? 6:05
> >>>> To: [email protected]
> >>>> Subject: Re: Proposal for chaning CXF Interceptor APIs. WAS:
> >>>> RE: When should we close the handlers in CXF?
> >>>>
> >>>>
> >>>> I'm still trying to find out how this interceptor stuff
> works. So
> >>>> forgive me if I seem naive. :-[
> >>>>
> >>>> You say CXF interceptors are stateless. Are you saying that
> >>>> "statelessness" is a requirement to be a CXF interceptor?
> >>>>
> >> Or are you
> >>
> >>>> saying that the processing interceptors that are currently
> >>>> used in CXF
> >>>> are stateless and that's all that need to be supported?
> >>>>
> >>>> I can definitely see a use case for CXF interceptors
> >>>> maintaining state.
> >>>>
> >>>> A simple one is an outbound message counter. The interceptor
> >>>> increments
> >>>> a counter on handleMessage() assuming the message makes out
> >>>> the end (has
> >>>> no way of knowing). So the interceptor must decrement its
> >>>>
> >> counter on
> >>
> >>>> handleFault() because that tells the interceptor that the
> >>>> message never
> >>>> made it out the end because of some interceptor downstream in
> >>>> the chain.
> >>>>
> >>>>
> >>>>
> >>> Once interceptors are created (eg, in
> >>>
> >> SoapBindingFactory.java), their instances are shared across
> >> all interceptor chains and threads. Interceptors have to be
> >> stateless for the sake of thread safe. If you really have to
> >> have some states that you want to be shared among
> >> interceptors, you can put them into Message.
> >>
> >>>
> >>>
> >>>> So, if I have this right, what you are proposing is to alter the
> >>>> semantics, and only call this onFinish() method on the unwind
> >>>> chain when
> >>>> the message makes finally makes it out the end of the chain.
> >>>>
> >>>> This changes the semantics quite a bit. With the
> >>>>
> >> handleFault approach
> >>
> >>>> one can assume that the message will be successful in
> >>>>
> >> negotiating the
> >>
> >>>> chain *unless* it is told otherwise, (handleFault),
> which leads to
> >>>> optimistic processing. The latter onFinish() approach
> >>>>
> >> requires me to
> >>
> >>>> *wait* to see *if* the message was successful, which is a
> >>>> pessimistic,
> >>>> possibly more expensive approach.
> >>>>
> >>>> It seems to me, that "fault" processing is the exceptional
> >>>> case, and one
> >>>> should be able to assume optimistic processing, unless
> >>>>
> >> told otherwise.
> >>
> >>>>
> >>>>
> >>> Actually what has been proposed does not change the
> >>>
> >> semantics a lot. We only want to do two changes:
> >>
> >>> 1. Remove handlerFault(). The reason for this has been
> >>>
> >> presented in the previous discussion, just quoted again
> >> below: "However, the difference is CXF interceptors are not
> >> designed to hook in user logic as these JAX-WS handlers do,
> >> thus handleFault is not needed in CXF interceptors (correct
> >> me if I am wrong, but I believe this is the purpose that
> >> JAX-WS handlers's handleFault method designed for. I.e., when
> >> a known exception - ProtocolException occurs, handleFault()
> >> gives handler developer a hook to clean up sth, for example,
> >> roll back a transaction, this is different from what close()
> >> is supposed to do. The latter is designed to clean things up
> >> under a succeeded situation). For any Runtime exceptions
> >> thrown by interceptors, we just wrap it as soap exception
> >> then dispatch it back calling handleMessage."
> >>
> >>> 2. Add a onFinish(Message) or onComplete(Message) method
> >>>
> >> (using name DanD suggested): this method is called in a
> >> reversed direction when chain completes, can be used to
> >> remove the sub-chain or interceptor re-entrance. For example,
> >> SoapOutInterceptor can use onComplete to write the end
> >> element of SoapBody SoapEnvelop, this way SoapOutInterceptor
> >> does not need to wrap its following interceptors in a sub chain.
> >>
> >>>
> >>>
> >>>
> >>>> Thoughts?
> >>>>
> >>>> The other thing I don't get, is what constitutes an
> Inbound Fault
> >>>> Message as opposed to an Inbound Message? Why does this make a
> >>>> difference in Interceptors of inbound and outbound messages?
> >>>>
> >>>> Cheers,
> >>>> -Polar
> >>>>
> >>>>
> >>>> Dan Diephouse wrote:
> >>>>
> >>>>
> >>>>> Could I offer just once suggestion? Could we rename the
> >>>>> postHandleMessage to
> >>>>> onFinish(Message) or onComplete(Message)?
> >>>>>
> >>>>> - Dan
> >>>>>
> >>>>> On 2/6/07, Unreal Jiang <[EMAIL PROTECTED]> wrote:
> >>>>>
> >>>>>
> >>>>>> Hi,
> >>>>>>
> >>>>>> Looks like there has no opponent for jervis'
> proposal, I will
> >>>>>> create a
> >>>>>> jira task for this proposal and sign it me.
> >>>>>>
> >>>>>> Cheers
> >>>>>> Unreal
> >>>>>>
> >>>>>> "Liu, Jervis" <[EMAIL PROTECTED]> wrote:
> >>>>>>
> >>>>>> ________________________________
> >>>>>>
> >>>>>> From: Dan Diephouse [mailto:[EMAIL PROTECTED]
> >>>>>> Sent: Tue 1/23/2007 1:02 AM
> >>>>>> To: [email protected]
> >>>>>> Subject: Re: Proposal for chaning CXF Interceptor APIs.
> >>>>>>
> >>>>>>
> >>>> WAS: RE: When
> >>>>
> >>>>
> >>>>>> should we close the handlers in CXF?
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> On 1/22/07, Liu, Jervis wrote:
> >>>>>>
> >>>>>>
> >>>>>>> Hi, I would like to summarize what we have been
> >>>>>>>
> >>>>>>>
> >>>> discussed in this
> >>>>
> >>>>
> >>>>>> thread
> >>>>>>
> >>>>>>
> >>>>>>> (including Eoghan's proposal posted last Oct [1]) regarding
> >>>>>>>
> >>>>>>>
> >>>>>> Interceptor
> >>>>>> API
> >>>>>>
> >>>>>>
> >>>>>>> changes. Any comments would be appreciated.
> >>>>>>>
> >>>>>>> Currently our Interceptor APIs look like below:
> >>>>>>>
> >>>>>>> public interface Interceptor {
> >>>>>>> void handleMessage(T message) throws Fault;
> >>>>>>> void handleFault(T message);
> >>>>>>> }
> >>>>>>>
> >>>>>>> Also in the interceptor chain, we have a notion of
> sub-chain or
> >>>>>>> interceptor chain reentrance by calling
> >>>>>>>
> >>>>>>>
> >>>> message.getInterceptorChain
> >>>>
> >>>>
> >>>>>> ().doIntercept(message)
> >>>>>>
> >>>>>>
> >>>>>>> or
> message.getInterceptorChain().doInterceptInSubChain(message).
> >>>>>>>
> >>>>>>> The main issues we have with the current implementation are:
> >>>>>>>
> >>>>>>> 1. Fault handling. See Eoghag's email [1]
> >>>>>>>
> >>>>>>> 2. Sub-chain reentrance. See previous discussion in
> this thread.
> >>>>>>>
> >>>>>>> We propose to change Interceptor API as below:
> >>>>>>>
> >>>>>>> public interface Interceptor {
> >>>>>>> void handleMessage(T message) throws Fault;
> >>>>>>> void handleFault(T message);
> >>>>>>> void close(T message);
> >>>>>>> }
> >>>>>>>
> >>>>>>> handleFault(T message) method is used to process
> fault message
> >>>>>>>
> >>>>>>>
> >>>>>> (which is
> >>>>>>
> >>>>>>
> >>>>>>> done by handleMessage() in fault-chain currently).
> >>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>>
> >>>>>>> I'm not sure I understand how you want to use this. I
> >>>>>>>
> >>>>>>>
> >>>> guess I could
> >>>>
> >>>>
> >>>>>> see
> >>>>>> two
> >>>>>>
> >>>>>>
> >>>>>>> ways
> >>>>>>>
> >>>>>>> 1. Remove In/OutFault interceptors and call handleFault
> >>>>>>>
> >>>>>>>
> >>>> on the In/Out
> >>>>
> >>>>
> >>>>>>> interceptors. I don't know that mapping works especially
> >>>>>>>
> >>>>>>>
> >>>> well though.
> >>>>
> >>>>
> >>>>>>> 2. Don't call handleFault on in/out interceptors, but
> >>>>>>>
> >> only on the
> >>
> >>>>>>> in/outFault interceptors - this would mean, for example,
> >>>>>>>
> >>>>>>>
> >>>> that the
> >>>>
> >>>>
> >>>>>> logic
> >>>>>> from
> >>>>>>
> >>>>>>
> >>>>>>> Soap11OutFaultInterceptor would be moved from the
> >>>>>>>
> >>>>>>>
> >>>> handleMessage to
> >>>>
> >>>>
> >>>>>>> handleFault.
> >>>>>>>
> >>>>>>> Can you be more specific about what you mean?
> >>>>>>>
> >>>>>>>
> >>>>>> Sorry, after rethinking about this, I've changed my mind
> >>>>>>
> >>>>>>
> >>>> slightly, so
> >>>>
> >>>>
> >>>>>> here
> >>>>>> is the idea:
> >>>>>>
> >>>>>> CXF Interceptor API will be similiar to JAX-WS API,
> >>>>>>
> >>>>>>
> >>>> section 9.3.2.1.
> >>>>
> >>>>
> >>>>>> Throw ProtocolException or a subclass This indicates that
> >>>>>>
> >>>>>>
> >>>> normal message
> >>>>
> >>>>
> >>>>>> processing should cease.
> >>>>>> Subsequent actions depend on whether the MEP in use requires a
> >>>>>> response to
> >>>>>> the message currently
> >>>>>> being processed or not:
> >>>>>>
> >>>>>> Response: Normal message processing stops, fault message
> >>>>>>
> >> processing
> >>
> >>>>>> starts. The message direction
> >>>>>> is reversed, if the message is not already a fault message
> >>>>>>
> >>>>>>
> >>>> then it is
> >>>>
> >>>>
> >>>>>> replaced with a fault message4,
> >>>>>> and the runtime invokes handleFault on the next handler or
> >>>>>>
> >>>>>>
> >>>> dispatches
> >>>>
> >>>>
> >>>>>> the
> >>>>>> message (see
> >>>>>> section 9.1.2.2) if there are no further handlers.
> >>>>>>
> >>>>>> No response: Normal message processing stops, close is
> >>>>>>
> >>>>>>
> >>>> called on each
> >>>>
> >>>>
> >>>>>> previously invoked handler
> >>>>>> in the chain, the exception is dispatched (see section
> 9.1.2.3).
> >>>>>>
> >>>>>>
> >>>>>> Throw any other runtime exception This indicates that
> >>>>>>
> >>>>>>
> >>>> normal message
> >>>>
> >>>>
> >>>>>> processing should cease. Subse-
> >>>>>> quent actions depend on whether the MEP in use includes a
> >>>>>>
> >>>>>>
> >>>> response to
> >>>>
> >>>>
> >>>>>> the
> >>>>>> message currently being
> >>>>>> processed or not:
> >>>>>>
> >>>>>> Response: Normal message processing stops, close is
> >>>>>>
> >> called on each
> >>
> >>>>>> previously invoked handler in
> >>>>>> the chain, the message direction is reversed, and the
> >>>>>>
> >> exception is
> >>
> >>>>>> dispatched (see section 9.1.2.3).
> >>>>>>
> >>>>>>
> >>>>>> No response: Normal message processing stops, close is
> >>>>>>
> >>>>>>
> >>>> called on each
> >>>>
> >>>>
> >>>>>> previously invoked handler
> >>>>>> in the chain, the exception is dispatched (see section
> 9.1.2.3).
> >>>>>>
> >>>>>> However, the difference is CXF interceptors are not
> >>>>>>
> >>>>>>
> >>>> designed to hook in
> >>>>
> >>>>
> >>>>>> user logic as these JAX-WS handlers do, thus handleFault
> >>>>>>
> >>>>>>
> >>>> is not needed
> >>>>
> >>>>
> >>>>>> in CXF interceptors (correct me if I am wrong, but I
> >>>>>>
> >>>>>>
> >>>> believe this is
> >>>>
> >>>>
> >>>>>> the purpose that JAX-WS handlers's handleFault method
> >>>>>>
> >>>>>>
> >>>> designed for.
> >>>>
> >>>>
> >>>>>> I.e, when
> >>>>>> a known exception - ProtocolException occurs,
> >>>>>>
> >> handleFault() gives
> >>
> >>>>>> handler
> >>>>>> developer a hook to clean up sth, for example, roll back a
> >>>>>>
> >>>>>>
> >>>> transaction,
> >>>>
> >>>>
> >>>>>> this is different from what close() is supposed to do. The
> >>>>>>
> >>>>>>
> >>>> latter is
> >>>>
> >>>>
> >>>>>> designed to clean things up under a succeeded
> >>>>>>
> >> situation). For any
> >>
> >>>>>> Runtime
> >>>>>> exceptions thrown by interceptors, we just wrap it as soap
> >>>>>>
> >>>>>>
> >>>> exception
> >>>>
> >>>>
> >>>>>> then
> >>>>>> dispatch it back calling handleMessage.
> >>>>>>
> >>>>>> So here is the change we need to make:
> >>>>>>
> >>>>>> 1. Add a postHandleMessage() into Interceptor interface
> >>>>>>
> >>>>>> 2. Remove handleFault() method from Interceptor
> >>>>>>
> >>>>>>
> >>>> interface. Or we can
> >>>>
> >>>>
> >>>>>> still keep it for a while until we are absolutely sure we
> >>>>>>
> >>>>>>
> >>>> wont need
> >>>>
> >>>>
> >>>>>> this method, but I presume there is nothing we need to
> >>>>>>
> >> do in this
> >>
> >>>>>> method.
> >>>>>>
> >>>>>> 3. We will NOT add a close() method into Interceptor
> >>>>>>
> >> interface, as
> >>
> >>>>>> CXF interceptors are stateless, there is no resources
> >>>>>>
> >> need to be
> >>
> >>>>>> closed.
> >>>>>>
> >>>>>> public interface Interceptor {
> >>>>>> void handleMessage(T message) throws Fault;
> >>>>>> void postHandleMessage(T message);
> >>>>>> }
> >>>>>>
> >>>>>> When an interceptor chain ends normally, we need to call
> >>>>>> postHandleMessage() on each previously traversed
> >>>>>>
> >> interceptor in a
> >>
> >>>>>> reversed
> >>>>>> direction.
> >>>>>>
> >>>>>> When a fault occurs on the in-bound chain, an exception
> >>>>>>
> >>>>>>
> >>>> will be thrown
> >>>>
> >>>>
> >>>>>> from the interceptor, after catching the exception in
> >>>>>> PhaseInterceptorChain, we unwind the current chain by calling
> >>>>>> postHandleMessage() on each previously traversed
> >>>>>>
> >> interceptor and
> >>
> >>>>>> then jump
> >>>>>> to the out-fault-chain, calling handleMessage() on each
> >>>>>>
> >>>>>>
> >>>> interceptor
> >>>>
> >>>>
> >>>>>> with
> >>>>>> the fault message.
> >>>>>>
> >>>>>> Any thoughs?
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>> close(T message) method is called on a reverse direction
> >>>>>>>
> >>>>>>>
> >>>> at the end of
> >>>>
> >>>>
> >>>>>>> interceptor chain or when a fault or exception occurs.
> >>>>>>>
> >>>>>>>
> >>>> Take the fault
> >>>>
> >>>>
> >>>>>>> handling case as an example, below is how handleFault
> >>>>>>>
> >>>>>>>
> >>>> and close work
> >>>>
> >>>>
> >>>>>>> together
> >>>>>>>
> >>>>>>>
> >>>>>>
> >>>>>>
> >>>>>>> +1 to close() - Although I think Eoghan has a good point
> >>>>>>>
> >>>>>>>
> >>>> about the
> >>>>
> >>>>
> >>>>>> ordering
> >>>>>>
> >>>>>>
> >>>>>>> not necessarily being the same. I think we need to do a
> >>>>>>>
> >>>>>>>
> >>>> little bit
> >>>>
> >>>>
> >>>>>> more
> >>>>>>
> >>>>>>
> >>>>>>> digging before we can know whether or not sub chains can
> >>>>>>>
> >>>>>>>
> >>>> be removed.
> >>>>
> >>>>
> >>>>>>> when a fault occurs on the in-chain, we unwind the
> >>>>>>>
> >>>>>>>
> >>>> current chain by
> >>>>
> >>>>
> >>>>>> calling
> >>>>>>
> >>>>>>
> >>>>>>> close() on each previously traversed interceptor and
> >>>>>>>
> >>>>>>>
> >>>> then jump to the
> >>>>
> >>>>
> >>>>>>> out-fault-chain, calling handleFault() on each
> >>>>>>>
> >>>>>>>
> >>>> interceptor with the
> >>>>
> >>>>
> >>>>>> fault
> >>>>>>
> >>>>>>
> >>>>>>> message.
> >>>>>>>
> >>>>>>> Close method is also used to remove the sub-chain
> >>>>>>>
> >>>>>>>
> >>>> reentrance. See the
> >>>>
> >>>>
> >>>>>>> SOAPHandlerInterceptor example I posted previously.
> >>>>>>>
> >>>>>>> Cheers,
> >>>>>>> Jervis
> >>>>>>>
> >>>>>>> [1]
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>> http://mail-archives.apache.org/mod_mbox/incubator-cxf-dev/200
> >>>>
> >>>>
> >> 611.mbox/[EMAIL PROTECTED]
> >>
> > ublin.emea.iona.com%3e
> >
> >>>
> >>>
> >>>>>>
> >>>>>>
> >>>>> --
> >>>>> Dan Diephouse
> >>>>> Envoi Solutions
> >>>>> http://envoisolutions.com | http://netzooid.com/blog
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>>
> >>>>> ---------------------------------
> >>>>> Access over 1 million songs - Yahoo! Music Unlimited.
> >>>>>
> >>>>>
> >>>>
> >>>>
> >>>
> >>>
> >>
>
>