我的Mule应用程序中有以下流程:
<flow name="UpdateStatusFlow">
<vm:inbound-endpoint path="UpdateStatusFlow" exchange-pattern="request-response"/>
<async processingStrategy="asynchronous">
<request-reply>
<vm:outbound-endpoint path="request"/>
<vm:inbound-endpoint path="reply"/>
</request-reply>
</async>
<custom-transformer class="com.example.EanTransformer"/>
</flow>
在异步范围内,我依赖于vm的内容:inbound-endpoint,我认为它是该有效负载的副本,因此另一个副本被发送到EanTransformer,它也修改了有效负载。但似乎没有复制,因为在异步流程中我已经被EanTransformer ean代码修改了,这不是我的预期。如果我在EanTransformer中添加一些延迟,一切都很好,这对我来说这个变换器还没有修改消息。
所以问题是:如果异步范围真的得到了消息的副本(因为它写在这里:http://www.mulesoft.org/documentation/display/current/Async+Scope+Reference)或者处理与下一个组件相同的消息?或者我做错了什么?
我正在使用Mule 3.3.1。
答案 0 :(得分:1)
如果您进一步阅读引用的页面,它会声明:
即使异步作用域收到Mule消息的副本,也不会复制有效内容。两个Mule消息将引用相同的有效负载对象:继续沿着原始流的那个和由异步范围处理的消息。
换句话说,如果您的消息的有效负载是可变对象 (例如,包含不同字段的bean)和消息 异步范围内的处理器更改其中一个字段的值, 异步范围之外的消息处理器将看到更改 值。
答案 1 :(得分:0)
Async流不会收到消息的副本 - 而是接收原始有效负载。因此,有效负载的任何更改都应在异步流之前完成。这里写得清楚:
即使异步作用域收到Mule消息的副本,也不会复制有效内容。两个Mule消息将引用相同的有效负载对象:继续沿着原始流的那个和由异步范围处理的消息。
换句话说,如果消息的有效负载是可变对象(例如,其中包含不同字段的bean),并且异步作用域中的消息处理器更改其中一个字段的值,则消息处理器将在异步范围将看到更改的值。