【问题标题】:Messages are vanishing after restarting WSO2 Server重新启动 WSO2 服务器后消息消失
【发布时间】:2018-05-25 00:48:18
【问题描述】:

我正在为我的项目使用 WSO2 ESB 5.0.0 和 Apache activeMQ 5.14。我正在使用正在侦听队列的 jms 代理,并且代理正在使用 jms 消息存储来存储消息。还有一个消息处理器将从该消息存储中获取这些消息以进行进一步处理。

但是在重新启动 WSO2 服务器后,卡在队列中的消息正在出队并消失。

WSO2 有没有办法存储这些消息?

这是我的代理服务:

<?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>

消息存储TEST如下:

<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>

失败消息存储是:

<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>

消息处理器是:

<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>

【问题讨论】:

  • 尝试将 startonload 更改为 false 并重新启动并进行相同的测试并让我知道行为
  • @Muralidharan.rade 尝试将 startonload 更改为 false 并重新启动并进行了相同的测试。但是遇到了同样的问题,并且在重新启动服务器后 startonload 的值也更改为 true。 org.wso2.carbon.mediation.initializer.handler.ProxyLogHandler.handleLogAppenderSetter(ProxyLogHandler.java:41) 的 JMSMessageReceiver 未知错误处理消息 java.lang.NullPointerException ( ProxyLogHandler.java:14)
  • 我想这是 startonload 的一个已知问题。 stackoverflow.com/questions/46353468/… 但是对于你的原始问题,尝试停用代理并在重新启动后启动,应该不会遇到这个问题..

标签: wso2 jms activemq


【解决方案1】:

由于内存消息存储使用内存队列来存储消息,因此在重新启动或关闭的情况下消息将丢失。

这就是为什么不建议将其用于生产系统或大型消息处理系统的原因。可以查看推荐here

考虑使用其他形式的消息存储以获得更好的可靠性和有保证的传递。请参考以下选项: https://docs.wso2.com/display/ESB500/Adding+a+Message+Store

还可以考虑使用故障转移消息存储以提高可靠性。 https://docs.wso2.com/display/ESB500/Guaranteed+Delivery+with+Failover+Message+Store+and+Scheduled+Failover+Message+Forwarding+Processor

【讨论】:

  • 我还尝试了 JMS 消息存储,如下所示:-- 在代理服务中创建了一个 jms 消息存储,并再次添加了一个采样消息处理器以从队列中挑选这些消息以进行进一步处理。然后我停止了 WSO2 服务器一段时间,并将一些消息添加到由 wso2 jms 代理侦听的队列(req.Q)中。但是在启动 wso2 服务器后,消息从队列(req.Q)中出列,并且在 wso2 日志中我看到了空指针异常。此外,我没有在 jms 消息存储添加消息的队列中看到任何消息。为什么???
  • ERROR - JMSMessageReceiver Unknown error processing message java.lang.NullPointerException
  • @VivekShah 错误堆栈跟踪将有助于理解真正的问题,而不是单行。
  • 错误 - JMSMessageReceiver 在 org.wso2.carbon.mediation.initializer.handler.ProxyLogHandler.handleLogAppenderSetter(ProxyLogHandler.java:41) 在 org.wso2.carbon 的未知错误处理消息 java.lang.NullPointerException。 mediation.initializer.handler.ProxyLogHandler.handleRequestInFlow(ProxyLogHandler.java:14) 在 org.apache.synapse.core.axis2.ProxyServiceMessageReceiver.receive(ProxyServiceMessageReceiver.java:167) 在 org.apache.axis2.engine.AxisEngine.receive( AxisEngine.java:180)
  • 看起来消息在所有组件初始化之前就已经得到处理。异常可能是因为代理服务不可用或未正确初始化。启用调试模式并分析和共享您使用的服务的代码。
猜你喜欢
  • 2012-05-07
  • 2016-01-13
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 2015-08-29
  • 2014-07-24
相关资源
最近更新 更多