Sample 4: Introduction to Error Handling

<definitions xmlns="http://ws.apache.org/ns/synapse"> <!-- the default fault handling sequence used by Synapse - named 'fault' --> <sequence name="fault"> <log level="custom"> <property name="text" value="An unexpected error occured"/> <property name="message" expression="get-property('ERROR_MESSAGE')"/> </log> <drop/> </sequence> <sequence name="sunErrorHandler"> <log level="custom"> <property name="text" value="An unexpected error occured for stock SUN"/> <property name="message" expression="get-property('ERROR_MESSAGE')"/> <!--<property name="detail" expression="get-property('ERROR_DETAIL')"/>--> </log> <drop/> </sequence> <sequence name="main"> <in> <switch xmlns:m0="http://services.samples" source="//m0:getQuote/m0:request/m0:symbol"> <case regex="IBM"> <send> <endpoint> <address uri="http://localhost:9000/services/SimpleStockQuoteService"/> </endpoint> </send> </case> <case regex="MSFT"> <send> <endpoint key="bogus"/> </send> </case> <case regex="SUN"> <sequence key="sunSequence"/> </case> </switch> <drop/> </in> <out> <send/> </out> </sequence> <sequence name="sunSequence" onError="sunErrorHandler"> <send> <endpoint key="sunPort"/> </send> </sequence> </definitions>

Objective

Introduction to error handling with the 'fault' sequence

Pre-requisites

  • Deploy the SimpleStockQuoteService in the sample Axis2 server and start Axis2
  • Start Synapse using the configuration numbered 4 (repository/conf/sample/synapse_sample_4.xml)
    Unix/Linux: sh synapse.sh -sample 4
    Windows: synapse.bat -sample 4

Executing the Client

First send a stock quote request from the sample client for the symbol 'IBM' as follows.

ant stockquote -Daddurl=http://localhost:9000/services/SimpleStockQuoteService -Dtrpurl=http://localhost:8280/ -Dsymbol=IBM

The request will be routed to the Axis2 server and client will receive a response as expected.

Standard :: Stock price = $95.26454380258552

Now send another stock quote request for the symbol 'MSFT' as follows.

ant stockquote -Daddurl=http://localhost:9000/services/SimpleStockQuoteService -Dtrpurl=http://localhost:8280/ -Dsymbol=MSFT

For MSFT requests Synapse is instructed to route the messages to an endpoint named 'bogus', which does not exist. Synapse executes the specified error handler sequence closest to the point where the error was encountered. In this case, the currently executing sequence is 'main' and it does not specify an 'onError' attribute. Whenever Synapse cannot find an error handler, it looks for a sequence named 'fault'. Thus the 'fault' sequence can be seen executing, and writing the generic error message to the logs.

[HttpServerWorker-1] DEBUG SendMediator - Send mediator :: mediate() [HttpServerWorker-1] ERROR IndirectEndpoint - Reference to non-existent endpoint for key : bogus [HttpServerWorker-1] DEBUG MediatorFaultHandler - MediatorFaultHandler :: handleFault [HttpServerWorker-1] DEBUG SequenceMediator - Sequence mediator <fault> :: mediate() [HttpServerWorker-1] DEBUG LogMediator - Log mediator :: mediate() [HttpServerWorker-1] INFO LogMediator text = An unexpected error occured, message = Couldn't find the endpoint with the key : bogus

Now send another stock quote request for the symbol 'SUN'.

ant stockquote -Daddurl=http://localhost:9000/services/SimpleStockQuoteService -Dtrpurl=http://localhost:8280/ -Dsymbol=SUN

When the 'SUN' quote is requested, a custom sequence 'sunSequence' is invoked, and it specifies 'sunErrorHandler' as its error handler. Hence when the send fails, you could see the proper error handler invocation and the custom error message printed as follows.

[HttpServerWorker-1] DEBUG SequenceMediator - Sequence mediator <sunSequence> :: mediate() [HttpServerWorker-1] DEBUG SequenceMediator - Setting the onError handler for the sequence [HttpServerWorker-1] DEBUG AbstractListMediator - Implicit Sequence <SequenceMediator> :: mediate() [HttpServerWorker-1] DEBUG SendMediator - Send mediator :: mediate() [HttpServerWorker-1] ERROR IndirectEndpoint - Reference to non-existent endpoint for key : sunPort [HttpServerWorker-1] DEBUG MediatorFaultHandler - MediatorFaultHandler :: handleFault [HttpServerWorker-1] DEBUG SequenceMediator - Sequence mediator <sunErrorHandler> :: mediate() [HttpServerWorker-1] DEBUG AbstractListMediator - Implicit Sequence <SequenceMediator> :: mediate() [HttpServerWorker-1] DEBUG LogMediator - Log mediator :: mediate() [HttpServerWorker-1] INFO LogMediator text = An unexpected error occured for stock SUN, message = Couldn't find the endpoint with the key : sunPort

Back to Catalog