0
votes

I am using WSO2 ESB 5.0.0 and Apache activeMQ 5.14 for my project.I am using jms proxy which is listening to a queue and the proxy is using jms message store to store the messages.And there is a message processor which will pick up those messages from that message store for further processing.

But after restarting WSO2 server the messages which were stuck at the queue are getting dequeued and vanished.

Is there any way to store those messages by WSO2?

Here is my proxy service:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="abcMQ"
       startOnLoad="true"
       statistics="disable"
       trace="disable"
       transports="jms">
   <target>
      <inSequence>
         <log level="full" separator="**Consumed from abc IN Seq**"/>
         <property name="DISABLE_CHUNKING"
                   scope="axis2"
                   type="STRING"
                   value="true"/>
         <store messageStore="TEST"/>
      </inSequence>
      <outSequence>
         <send/>
      </outSequence>
      <faultSequence/>
   </target>
   <parameter name="transport.jms.Destination">req.Q</parameter>
   <parameter name="transport.jms.ContentType">application/XML</parameter>
   <description/>
</proxy>

The message store TEST is below:

<messageStore name="TEST" class="org.apache.synapse.message.store.impl.jms.JmsStore" xmlns="http://ws.apache.org/ns/synapse">
   <parameter name="java.naming.factory.initial">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
   <parameter name="java.naming.provider.url">tcp://localhost:61616</parameter>
   <parameter name="store.jms.destination">TEST.Q</parameter>
   <parameter name="store.jms.username">admin</parameter>
   <parameter name="store.jms.password">admin</parameter>
   <parameter name="store.jms.JMSSpecVersion">1.1</parameter>
   <parameter name="store.producer.guaranteed.delivery.enable">true</parameter>
   <parameter name="store.failover.message.store.name">fail</parameter>
</messageStore>

The fail message store is:

<messageStore name="fail" class="org.apache.synapse.message.store.impl.jms.JmsStore" xmlns="http://ws.apache.org/ns/synapse">
   <parameter name="java.naming.factory.initial">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
   <parameter name="java.naming.provider.url">tcp://localhost:61616</parameter>
   <parameter name="store.jms.destination">fail.Q</parameter>
   <parameter name="store.jms.username">admin</parameter>
   <parameter name="store.jms.password">admin</parameter>
   <parameter name="store.jms.JMSSpecVersion">1.1</parameter>
   <parameter name="store.producer.guaranteed.delivery.enable">false</parameter>
   <parameter name="store.failover.message.store.name">fail</parameter>
</messageStore>

Message processor is:

<messageProcessor name="TestProcessor" class="org.apache.synapse.message.processor.impl.sampler.SamplingProcessor" messageStore="TEST" xmlns="http://ws.apache.org/ns/synapse">
   <parameter name="interval">1000</parameter>
   <parameter name="concurrency">1</parameter>
   <parameter name="sequence">DemoSequence</parameter>
   <parameter name="is.active">true</parameter>
</messageProcessor>
1
try changing startonload to false and restart and do the same test and let me know the behavior - Muralidharan.rade
@Muralidharan.rade tried with changing startonload to false and restarted and done the same test.But got the same issue and the value of startonload also changed to true after restarting server. JMSMessageReceiver Unknown error processing message java.lang.NullPointerException at org.wso2.carbon.mediation.initializer.handler.ProxyLogHandler.handleLogAppenderSetter(ProxyLogHandler.java:41) at org.wso2.carbon.mediation.initializer.handler.ProxyLogHandler.handleRequestInFlow(ProxyLogHandler.java:14) - Vivek Shah
I suppose this is a known issue with startonload. stackoverflow.com/questions/46353468/… But for ur original issue, try to deactivate the proxy and start after the restart and should not face this issue.. - Muralidharan.rade

1 Answers

0
votes

Since the in-memory message stores uses an in-memory queue to store the messages, the messages will be lost in case of a restart or shutdown.

That's why its use is not recommended for Production systems or large scale message processing systems. You can view the recommendation here.

Consider using other forms of message stores for better reliability and guaranteed delivery. Refer the following options: https://docs.wso2.com/display/ESB500/Adding+a+Message+Store

Also consider using a fail-over message store for better reliability. https://docs.wso2.com/display/ESB500/Guaranteed+Delivery+with+Failover+Message+Store+and+Scheduled+Failover+Message+Forwarding+Processor