我已经在 WSO2 ESB 4.7.0 中配置了带有事务和 CLIENT_ACKNOWLEDGE 的 Apache ActiveMQ。 axis2.xml 配置是:
<parameter name="transport.jms.SessionTransacted">true</parameter>
<parameter name="transport.jms.SessionAcknowledgement" locked="true">CLIENT_ACKNOWLEDGE</parameter>
我有一个带有 jms 传输的简单直通代理,它将 JMS 队列中的消息传递到 jax-rs 服务。代理代码是:
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="MediaMoveQueue"
transports="jms"
startOnLoad="true"
trace="enable">
<description/>
<target>
<inSequence>
<property name="messageType" value="application/json" scope="axis2"/>
<property name="ContentType" value="application/json" scope="axis2"/>
<send receive="JmsRollbackSequence">
<endpoint>
<address uri="http://192.168.1.2:9766/RestMediaMove_1.0.0/services/rest_media_move_i_f/restmediamoveif/hello"/>
</endpoint>
</send>
<log level="custom">
<property name="In MediaMoveQueue JMSERROR"
expression="get-property('JMSERROR')"/>
</log>
<switch source="get-property('JMSERROR')">
<case regex="true">
<property name="SET_ROLLBACK_ONLY" value="true" scope="axis2"/>
<log level="custom">
<property name="In MediaMoveQueue Transaction Action"
value="Rollbacked"/>
</log>
</case>
<case regex="false">
<log level="custom">
<property name="In MediaMoveQueue Transaction Action"
value="Committed"/>
</log>
</case>
<default>
<property name="SET_ROLLBACK_ONLY" value="true" scope="axis2"/>
<log level="custom">
<property name="In MediaMoveQueue Transaction Action default"
value="Rollbacked"/>
</log>
</default>
</switch>
</inSequence>
<outSequence>
<log level="full">
<property name="test" value="IN outsequence"/>
</log>
<send/>
</outSequence>
</target>
<parameter name="transport.jms.ContentType">
<rules>
<jmsProperty>contentType</jmsProperty>
<default>application/json</default>
</rules>
</parameter>
</proxy>
JmsRollbackSequence 序列接收来自 jax-rs 服务的回复,并根据返回的回复成功或失败,我想回滚 JMS 事务。但如果我设置属性
在 JmsRollbackSequence 中它完全没有效果(在使用下面所示的序列之前我先尝试了它)。事务永远不会回滚。仅当在 inSequence 中设置该属性时,回滚才有效。
这是 JmsRollbackSequence 的代码:
<?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="JmsRollbackSequence">
<property name="JMSERROR" value="true"/>
<log level="full">
<property name="test" value="IN JmsRollbackSequence"/>
</log>
</sequence>
因此,我尝试在 JmsRollbackSequence 中设置一个名为 JMSERROR 的属性,并通过在 inSequence 中的发送中介器之后读取它,我认为我可以回滚 inSequence 中的事务。但这也行不通。 inSequence 中的 switch case 在 JmsRollbackSequence 中设置属性之前调用,因此当我读取它时,它总是返回 null。
所以我的问题是:
1)我们可以设置
<property name="SET_ROLLBACK_ONLY" value="true" scope="axis2"/>
按顺序?为什么它在 JmsRollbackSequence 中不起作用?
2) 由于中介器应该按顺序调用,为什么 inSequence 中的 switch case 在 JmsRollbackSequence 有机会读取回复并设置 JMSERROR 属性之前运行?