通过 Mule ESB 中的 VM 端点时会话变量被清除(使用 AMQP)
Session variable are wiped out when passing through VM endpoint in Mule ESB ( Uses AMQP)
我使用的是非常简单的流程,从第一个流程开始,我从 AMQP(Ack 模式:Manual
)获取消息,然后通过 VM 将其传递给第二个流程,在第二个流程中,我' m 使用 AMQP 确认处理器确认每条消息。
当我们使用 VM 时,传送标签和通道标签都被清除(这对 AMQP 确认消息处理器是强制性的,如本 url AMQP acknowledgement mule 中所述)。所以我试图将交付标签和 amqp.channel 保存在会话变量中。
第一次疑惑,存储在session变量中的Channel值在通过VM时被抹掉了,但是可以看到delivery tag
观察:
- 而不是
VM
如果我们使用 flow-ref
。它工作正常。但就我而言,我只需要使用 VM。
amqp.delivery-标签type
(java.lang.long)
amqp.channel type
(com.rabbitmq.client.impl.ChannelN).
如果 amqp.channel 的“类型”导致问题。如果是这样,我该如何将其保存在会话变量中。请建议。请找到我的配置 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>
有谁知道如何解决这个问题。
这永远行不通
<vm:outbound-endpoint exchange-pattern="one-way" ...
首先,因为假设模式是单向的,原始线程将结束,消息将被放入不同线程池的 seda 队列中。
然后因为,当您将消息放在 VM、Http 等传输上时。流变量和对象实例会丢失,即使您尝试将它们序列化并将它们发送到另一台主机,它也不会对另一台主机有意义,即:打开一个文件,尝试以某种方式序列化描述符并将其发送到另一台主机,这没有意义。
我的建议是使用 flow-ref
而不是虚拟机。
我使用的是非常简单的流程,从第一个流程开始,我从 AMQP(Ack 模式:Manual
)获取消息,然后通过 VM 将其传递给第二个流程,在第二个流程中,我' m 使用 AMQP 确认处理器确认每条消息。
当我们使用 VM 时,传送标签和通道标签都被清除(这对 AMQP 确认消息处理器是强制性的,如本 url AMQP acknowledgement mule 中所述)。所以我试图将交付标签和 amqp.channel 保存在会话变量中。
第一次疑惑,存储在session变量中的Channel值在通过VM时被抹掉了,但是可以看到delivery tag
观察:
- 而不是
VM
如果我们使用flow-ref
。它工作正常。但就我而言,我只需要使用 VM。 amqp.delivery-标签
type
(java.lang.long) amqp.channeltype
(com.rabbitmq.client.impl.ChannelN).如果 amqp.channel 的“类型”导致问题。如果是这样,我该如何将其保存在会话变量中。请建议。请找到我的配置 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>
有谁知道如何解决这个问题。
这永远行不通
<vm:outbound-endpoint exchange-pattern="one-way" ...
首先,因为假设模式是单向的,原始线程将结束,消息将被放入不同线程池的 seda 队列中。
然后因为,当您将消息放在 VM、Http 等传输上时。流变量和对象实例会丢失,即使您尝试将它们序列化并将它们发送到另一台主机,它也不会对另一台主机有意义,即:打开一个文件,尝试以某种方式序列化描述符并将其发送到另一台主机,这没有意义。
我的建议是使用 flow-ref
而不是虚拟机。