通过Mule ESB中的VM端点时,会话变量被清除(使用AMQP)

时间:2015-01-21 02:39:14

标签: mule mule-studio mule-el mule-component

我正在使用非常简单的流程,从第一个流程开始,我从AMQP(Ack模式:Manual)接收消息并通过VM将其传递给第二个流程,在我正在使用的第二个流程中AMQP确认处理器确认每条消息。

当我们使用VM时,两个传递标记和通道标记都被清除(这对于AMQP确认消息处理器是必需的,如此URL AMQP acknowledgement mule中所述)。所以我试图在会话变量中保存deliver-tag和amqp.channel。

我第一次想知道,存储在会话变量中的Channel值在通过VM时会被删除,但是能够看到传递标记。

观察:

  1. 如果我们使用VM,而不是flow-ref。它工作正常。但就我而言,我只需要使用VM。
  2. amqp.delivery-tag type(java.lang.long) amqp.channel type(com.rabbitmq.client.impl.ChannelN)。

    如果amqp.channel的'Type'导致问题。如果是这样,我怎么能在会话变量中保存它。请建议。请找我的配置xml。

     <flow name="testrabbitmqFlow1" doc:name="testrabbitmqFlow1" >
    <amqp:inbound-endpoint queueName="amqp.test.queue" exchangeDurable="true" queueDurable="true" responseTimeout="1000000"  connector-ref="AMQP_Test"  doc:name="AMQP">
    <amqp:transaction recoverStrategy="REQUEUE" action="ALWAYS_BEGIN"/>
    </amqp:inbound-endpoint>
    <byte-array-to-string-transformer doc:name="Byte Array to String"/>
    <set-session-variable variableName="storedeliveryTag" value="#[flowVars['amqp.delivery-tag']]" doc:name="Session Variable"/>
    <set-session-variable variableName="storeChannel" value="#[flowVars['amqp.channel']]" doc:name="Session Variable"/>
    <vm:outbound-endpoint exchange-pattern="one-way" path="/test" doc:name="VM">
        <vm:transaction action="NONE"/>
    </vm:outbound-endpoint>
    

                                                                 

    是否有人知道如何解决问题。

1 个答案:

答案 0 :(得分:3)

这将永远不会起作用

<vm:outbound-endpoint exchange-pattern="one-way" ...

首先,因为假设模式是单向的,原始线程将结束,并且消息将被放入不同线程池的seda队列中。

然后因为,当你在VM,Http等传输上发送消息时,流变量会丢失,而对象实例,即使你试图将它们序列化并发送给另一台主机,它也没有意义到另一个主机,即:打开一个文件,尝试以某种方式序列化描述符并将其发送到另一个主机,这是没有意义的。

我的推荐是使用flow-ref而不是vm。