Transactions 在WSO2 ESB 4.7.0中,我们可以按接收顺序执行JMS回滚吗?

Transactions 在WSO2 ESB 4.7.0中,我们可以按接收顺序执行JMS回滚吗?,transactions,jms,wso2,activemq,wso2esb,Transactions,Jms,Wso2,Activemq,Wso2esb,我已经在WSO2 ESB 4.7.0中配置了带有事务和客户端确认的Apache ActiveMQ。axis2.xml配置为: <parameter name="transport.jms.SessionTransacted">true</parameter> <parameter name="transport.jms.SessionAcknowledgement" locked="true">CLIENT_ACKNOWLEDGE</parameter&

我已经在WSO2 ESB 4.7.0中配置了带有事务和客户端确认的Apache ActiveMQ。axis2.xml配置为:

<parameter name="transport.jms.SessionTransacted">true</parameter>
<parameter name="transport.jms.SessionAcknowledgement" locked="true">CLIENT_ACKNOWLEDGE</parameter>
true
客户确认
我有一个带有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>

内容类型
应用程序/json
JmsRollbackSequence序列从jax rs服务接收应答,根据返回的应答成功或失败,我想回滚JMS事务。但是如果我设置属性 在JmsRollbackSequence中,它绝对没有效果(在使用下面所示的序列之前,我首先尝试了它)。事务永远不会回滚。只有在序列中设置了属性时,回滚才会工作。 以下是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中介程序之后读取它,我认为可以在inSequence中回滚事务。但这也不起作用。inSequence中的开关大小写是在JmsRollbackSequence中设置属性之前调用的,因此当我读取它时,它总是返回null

因此,我的问题是:

1) 我们能设定吗

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

按顺序?为什么它在JmsRollbackSequence中不起作用


2) 由于中介应该按顺序调用,为什么在JmsRollbackSequence有机会读取回复并设置JMSERROR属性之前,INSESQUENCE中的switch case会运行?

我相信您只能从同一序列或与之关联的故障序列中控制事务。但是WSO2文档并没有真正提到这一点

关于第二个问题:send中介是非阻塞的,即在send中介返回之前将执行以下中介。如果希望它等待响应,则需要使用调出中介。然后,您可以评估响应,并在需要时执行回滚(都在序列内部)