Transactions JMS事务回滚属性在WSO2 4.8.1 ESB中不起作用
我制作了一个简单的代理服务,它监听来自JMS队列(基于ActiveMQ)的XML消息并对其进行一些转换。我希望实现JMS事务回滚属性,以便在转换过程中如果发生任何错误或异常,消息将回滚 问题: 我已经按照指示做了,但它不起作用。发生任何异常时,消息不会回滚。记录了异常,但消息丢失 代理服务源代码: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"
<?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。