![](/img/trans.png)
[英]In WSO2 ESB 4.7.0 can we do JMS rollback in receiving sequence?
[英]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.