synapse-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Prasad Jeewantha <jeewamp....@gmail.com>
Subject How does fault handling work in synapse?
Date Fri, 31 May 2013 11:29:52 GMT
Hi All,

There is an issue in synapse which Im trying to solve where I get an
EmptyStackException when running this sample
http://synapse.apache.org/Synapse_Samples.html#Sample57.

Here is the stacktrace.

java.util.EmptyStackException
    at java.util.Stack.peek(Stack.java:85)
    at java.util.Stack.pop(Stack.java:67)
    at
org.apache.synapse.endpoints.DynamicLoadbalanceEndpoint$DynamicLoadbalanceFaultHandlerImpl.onFault(DynamicLoadbalanceEndpoint.java:506)
    at org.apache.synapse.FaultHandler.handleFault(FaultHandler.java:54)
    at
org.apache.synapse.endpoints.AbstractEndpoint.invokeNextFaultHandler(AbstractEndpoint.java:618)
    at
org.apache.synapse.endpoints.AbstractEndpoint.onFault(AbstractEndpoint.java:467)
    at
org.apache.synapse.endpoints.AddressEndpoint.onFault(AddressEndpoint.java:43)
    at org.apache.synapse.FaultHandler.handleFault(FaultHandler.java:102)
    at
org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:243)
    at
org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:166)
    at
org.apache.synapse.transport.passthru.TargetErrorHandler$1.run(TargetErrorHandler.java:132)
    at
org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

What I saw while debugging was that when an endpoint *send(Msgctx)* method
is invoked, a fault handler is pushed to a stack in MessageContext. When
the message goes to another endpoint, another fault handler will be pushed
to the stack in the *send(Msgctx) *method of the second endpoint. But as
far as I figured out, the fault handlers are poped from the stack only when
a fault occurs, i.e. in the *onFalut()* method of a fault handler.

My question is, should'nt we pop a fault handler from the stack, when the
message goes out from an endpoint? Otherwise how do we figure out which
fault handler in the stack belongs to which endpoint?

It would be great if someone can explain me briefly the architecture of
fault hanlding in synapse. Any help is appreciated.

Thanks,
PJ

Mime
View raw message