簡體   English   中英

在WSO2 ESB 4.7.0中我們可以在接收序列中進行JMS回滾嗎?

[英]In WSO2 ESB 4.7.0 can we do JMS rollback in receiving sequence?

我在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>

我有一個簡單的passthrough代理與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中的send mediator之后讀取它,我以為我可以在inSequence中回滾事務。 但這也不起作用。 inSequence中的switch case在JmsRollbackSequence中設置屬性之前調用,所以當我讀它時它總是返回null。

所以我的問題是:

1)我們可以設置

<property name="SET_ROLLBACK_ONLY" value="true" scope="axis2"/>

順序? 為什么它在JmsRollbackSequence中不起作用?

2)由於調解器應該按順序調用,為什么inSequence中的switch case在JmsRollbackSequence有機會讀取應答並設置JMSERROR屬性之前運行?

我相信你只能從同一序列或與之相關的故障序列中控制一個事務。 但是WSO2文檔並沒有真正說明這一點......

關於你的第二個問題: 發送中介是非阻塞的 ,即在發送中介返回之前將執行以下調解器。 如果您希望它等待響應,那么您需要使用callout mediator。 然后,您可以評估響應並在需要時執行回滾(全部在inSequence內)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM