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 キュー内のメッセージを jax-rs サービスに渡す jms トランスポートを使用した単純なパススルー プロキシがあります。プロキシ コードは次のとおりです。
<?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 の send mediator の後にそれを読み取ることで、inSequence でトランザクションをロールバックできると考えました。しかし、これもうまくいきません。プロパティが JmsRollbackSequence で設定される前に inSequence の switch ケースが呼び出されるため、それを読み取ると常に null が返されます。
だから私の質問は:
1) 設定できますか
<property name="SET_ROLLBACK_ONLY" value="true" scope="axis2"/>
順番に?JmsRollbackSequence で機能しないのはなぜですか?
2) メディエータは順番に呼び出されることになっているのに、JmsRollbackSequence が応答を読み取って JMSERROR プロパティを設定する前に inSequence の switch ケースが実行されるのはなぜですか?