Transactions JMS事务回滚属性在WSO2 4.8.1 ESB中不起作用

Transactions JMS事务回滚属性在WSO2 4.8.1 ESB中不起作用,transactions,jms,wso2,wso2esb,Transactions,Jms,Wso2,Wso2esb,我制作了一个简单的代理服务,它监听来自JMS队列(基于ActiveMQ)的XML消息并对其进行一些转换。我希望实现JMS事务回滚属性,以便在转换过程中如果发生任何错误或异常,消息将回滚 问题: 我已经按照指示做了,但它不起作用。发生任何异常时,消息不会回滚。记录了异常,但消息丢失 代理服务源代码: <?xml version="1.0" encoding="UTF-8"?> <proxy xmlns="http://ws.apache.org/ns/synapse"

我制作了一个简单的代理服务,它监听来自JMS队列(基于ActiveMQ)的XML消息并对其进行一些转换。我希望实现JMS事务回滚属性,以便在转换过程中如果发生任何错误或异常,消息将回滚

问题:

我已经按照指示做了,但它不起作用。发生任何异常时,消息不会回滚。记录了异常,但消息丢失

代理服务源代码:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="JMSGateway"
       transports="jms"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <property name="OUT_ONLY" value="true"/>
         <log level="full"/>
         <xslt key="conf:/xslt/ConvertToCDM.xslt">
            <resource location="conf:xslt/ConvertToCDM.xslt" key="ConvertToCDM"/>
         </xslt>
         <log level="full"/>
         <log/>

      </inSequence>
      <outSequence/>
      <faultSequence>
         <property name="SET_ROLLBACK_ONLY" value="true" scope="axis2"/>
         <log level="custom">
            <property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/>
            <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/>
            <property name="ERROR_DETAIL" expression="get-property('ERROR_DETAIL')"/>
            <property name="ERROR_EXCEPTION" expression="get-property('ERROR_EXCEPTION')"/>
            <property name="File_Name" expression="get-property('Received.File.Name')"/>
            <property name="Transaction Action" value="Rollbacked"/>
         </log>

      </faultSequence>
   </target>
   <parameter name="transport.jms.ContentType">
      <rules>
         <jmsProperty>contentType</jmsProperty>
         <default>application/xml</default>
      </rules>
   </parameter>
   <parameter name="transport.jms.ConnectionFactory">myQueueConnectionFactory</parameter>
   <parameter name="transport.jms.DestinationType">queue</parameter>
   <parameter name="transport.jms.Destination">CDMRequest</parameter>
   <description/>
</proxy>

内容类型
应用程序/xml
myQueueConnectionFactory
队列
CDMRequest

您应该将这些参数添加到代理定义中:

<parameter name="transport.jms.SessionAcknowledgement">CLIENT_ACKNOWLEDGE</parameter>
<parameter name="transport.jms.SessionTransacted">true</parameter>
CLIENT\u确认
真的
如果您可以多次看到错误日志,则消息已由ActiveMQ重新传递,并且您知道ESB配置是正确的(使用SET_rollback_ONLY=true进行回滚是有效的)

几次之后,根据ActiveMQ conf,消息应该从队列中删除并移动到死信队列

如果消息丢失,您应该查看ActiveMQ配置(请参阅)

您可以关注这样一个事实,即非持久化消息不会发送到DLQ,而是被删除。如果要更改此行为,请修改ActiveMQ配置:

<broker...>
  <destinationPolicy>
   <policyMap>
     <policyEntries>
       <!-- Set the following policy on all queues using the '>' wildcard -->
       <policyEntry queue=">">
         <!-- 
           Tell the dead letter strategy to also place non-persisted messages 
           onto the dead-letter queue if they can't be delivered.
         -->
         <deadLetterStrategy>
           <sharedDeadLetterStrategy processNonPersistent="true" />
         </deadLetterStrategy>
       </policyEntry>
     </policyEntries>
   </policyMap>
  </destinationPolicy>
...
</broker>

...

尝试时,inSequence中介内部出现异常,您可以从faultSequence中看到日志“Transaction Action=Rollbacked”?您的消息丢失:CDMRequest队列中没有消息,ActiveMQ.DLQ中没有消息?服务进入错误序列,是的,我看到“Transaction Action=Rollbacked”标记,但消息丢失。感谢您的详细评论,但我的服务生成的所有消息都是“持久的”但它们仍然没有进入ActiveMQ.DLQ…..它们是否由ActiveMQ重新传递(对于发送到JMS队列的一条消息,是否可以看到多个日志跟踪“Transaction Action=Rollbacked”)?在这种情况下,存在一个事务,您必须关注ActiveMQ配置。在另一种情况下,没有事务,您必须关注WSO2中的conf。日志中没有重复,因此我认为我必须关注WSO2中的conf。