[英]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.