簡體   English   中英

JMS事務回滾屬性在WSO2 4.8.1 ESB中不起作用

[英]JMS Transaction Rollback Property not working in WSO2 4.8.1 ESB

我做了一個簡單的代理服務,該服務正在偵聽來自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>

您應該將這些參數添加到代理def中:

<parameter name="transport.jms.SessionAcknowledgement">CLIENT_ACKNOWLEDGE</parameter>
<parameter name="transport.jms.SessionTransacted">true</parameter>

如果您可以多次看到錯誤日志,則表明該消息已由ActiveMQ重新發送,並且您知道您的ESB conf是正確的(使用SET_ROLLBACK_ONLY = true進行回滾是有效的)

幾次之后,根據ActiveMQ conf,應將消息從隊列中刪除,然后將其移至死信隊列。

如果消息丟失,則應查看ActiveMQ配置(請參閱http://activemq.apache.org/message-redelivery-and-dlq-handling.html

您可以關注以下事實,即非持久消息不會發送到DLQ而是會被刪除。 如果要更改此行為,請修改ActiveMQ conf:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM