Saturday, April 28, 2012

Configuring JMS Transaction Rollback in WSO2ESB

WSO2 ESB supports transactions in two ways..
  • Transaction mediator
  • JMS transport transaction

Here lets have a look on how we can use jms transport transaction to roll back the transactions in case of failures..
In my previous post, i explained how can we configure a proxy to listen to a particular queue..
Here , we'll  add two more additional parameters, to make it rollback the transaction when failures occur..

  1. Add a service level parameter to enable local JMS transaction...
 <parameter name="transport.jms.SessionTransacted">true</parameter>
You can define this parameter at your transport configuration, which is defined in the axis2 configuration..
Service level parameters will overwrite the transport level parameters..
 
    2. Add "SET_ROLLBACK_ONLY" property in the mediation flow(ie: @ your InSequence). When failure occurs , this property helps to rollback the local transaction.

    <property name="SET_ROLLBACK_ONLY" value="true" scope="axis2"/>
Here is the final modified configuration...

<proxy name="ErrorProxy" transports="https http jms" startOnLoad="true" trace="disable">
    <target endpoint="ErrorQueueEndpoint" inSequence="ErrorInSequence" faultSequence="fault"/>
  <parameter name="transport.jms.ContentType">
      <rules>
        <jmsProperty>contentType</jmsProperty>
        <default>text/xml</default>
      </rules>
  </parameter>
  <parameter name="transport.jms.ConnectionFactory">myQueueConnectionFactory</parameter>
  <parameter name="transport.jms.DestinationType">queue</parameter>
  <parameter name="transport.jms.SessionTransacted">true</parameter>
  <parameter name="transport.jms.Destination">errorqueue</parameter>
</proxy>
<sequence name="ErrorInSequence">
   <property name="SET_ROLLBACK_ONLY" value="true" scope="axis2"/>
    <log level="custom">
        <property name="Picked message" value="************"/>
    </log>
   <description/>
</sequence>
<endpoint xmlns="http://ws.apache.org/ns/synapse" name="ErrorQueueEndpoint">
    <address uri="http://localhost:9000/services/SimpleStockQuoteService1">
     <timeout>
       <duration>30000</duration>
       <responseAction>fault</responseAction>
     </timeout>
    </address>
</endpoint>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="fault">
    <log level="full">
        <property name="FAULT SEQ" value="***"/>
        <property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/>
        <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/>
    </log>
</sequence>
 If you down your endpoint(ie:ErrorQueueEndpoint); you will see that your message will remain the queue..
There is a detail article written by Rajika about the transactions support in WSO2ESB...

1 comment:

  1. how we can rollback the inserted rows using wso2dss in wso2 esb let me know...
    i have multiple tables like dependent if 1 one successfully inserted but while i am entering in 2nd table error occuered so 1st table inserted data also rollback how we can do this in wso2

    ReplyDelete