我正在使用非常简单的流程,从第一个流程开始,我从AMQP(Ack模式:Manual
)接收消息并通过VM将其传递给第二个流程,在我正在使用的第二个流程中AMQP确认处理器确认每条消息。
当我们使用VM时,两个传递标记和通道标记都被清除(这对于AMQP确认消息处理器是必需的,如此URL AMQP acknowledgement mule中所述)。所以我试图在会话变量中保存deliver-tag和amqp.channel。
我第一次想知道,存储在会话变量中的Channel值在通过VM时会被删除,但是能够看到传递标记。
观察:
VM
,而不是flow-ref
。它工作正常。但就我而言,我只需要使用VM。 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>
是否有人知道如何解决问题。
答案 0 :(得分:3)
这将永远不会起作用
<vm:outbound-endpoint exchange-pattern="one-way" ...
首先,因为假设模式是单向的,原始线程将结束,并且消息将被放入不同线程池的seda队列中。
然后因为,当你在VM,Http等传输上发送消息时,流变量会丢失,而对象实例,即使你试图将它们序列化并发送给另一台主机,它也没有意义到另一个主机,即:打开一个文件,尝试以某种方式序列化描述符并将其发送到另一个主机,这是没有意义的。
我的推荐是使用flow-ref
而不是vm。