【问题标题】:In WSO2 ESB 4.7.0 can we do JMS rollback in receiving sequence?在 WSO2 ESB 4.7.0 中,我们可以在接收序列中执行 JMS 回滚吗?
【发布时间】:2013-12-16 17:45:33
【问题描述】:

我在 WSO2 ESB 4.7.0 中为 Apache ActiveMQ 配置了事务和 CLIENT_ACKNOWLEDGE。 axis2.xml 配置是:

<parameter name="transport.jms.SessionTransacted">true</parameter>
<parameter name="transport.jms.SessionAcknowledgement" locked="true">CLIENT_ACKNOWLEDGE</parameter>

我有一个简单的带 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 中的发送中介之后读取它,我认为我可以回滚 inSequence 中的事务。但这也不起作用。 inSequence 中的 switch case 是在 JmsRollbackSequence 中设置属性之前调用的,所以当我阅读它时,它总是返回 null。

所以我的问题是:

1) 我们可以设置吗

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

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

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

【问题讨论】:

    标签: transactions jms wso2 activemq wso2esb


    【解决方案1】:

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

    关于您的第二个问题:send 中介者是非阻塞,即以下中介者将在发送中介者返回之前执行。如果您希望它等待响应,则需要改用 callout 中介。然后,您可以评估响应并在需要时进行回滚(全部在 inSequence 中)。

    【讨论】:

      猜你喜欢
      • 2013-11-24
      • 2012-04-30
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多