3

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 ケースが実行されるのはなぜですか?

4

1 に答える 1

1

同じシーケンスまたはそれに関連付けられた障害シーケンス内からのみトランザクションを制御できると思います。しかし、WSO2 のドキュメントには、これについて何も書かれていません...

2 番目の質問について:送信メディエーターは非ブロッキングです。つまり、送信メディエーターが戻る前に、次のメディエーターが実行されます。応答を待機させたい場合は、代わりにコールアウトメディエーターを使用する必要があります。次に、応答を評価し、必要に応じてロールバックを実行できます (すべて inSequence 内)。

于 2013-12-16T09:45:33.117 に答える