Mule中的异步范围没有MuleMessage的副本?

时间:2014-04-11 09:09:17

标签: asynchronous mule

我的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。

2 个答案:

答案 0 :(得分:1)

如果您进一步阅读引用的页面,它会声明:

  

即使异步作用域收到Mule消息的副本,也不会复制有效内容。两个Mule消息将引用相同的有效负载对象:继续沿着原始流的那个和由异步范围处理的消息。

     

换句话说,如果您的消息的有效负载是可变对象   (例如,包含不同字段的bean)和消息   异步范围内的处理器更改其中一个字段的值,   异步范围之外的消息处理器将看到更改   值。

答案 1 :(得分:0)

Async流不会收到消息的副本 - 而是接收原始有效负载。因此,有效负载的任何更改都应在异步流之前完成。这里写得清楚:

  

即使异步作用域收到Mule消息的副本,也不会复制有效内容。两个Mule消息将引用相同的有效负载对象:继续沿着原始流的那个和由异步范围处理的消息。

     

换句话说,如果消息的有效负载是可变对象(例如,其中包含不同字段的bean),并且异步作用域中的消息处理器更改其中一个字段的值,则消息处理器将在异步范围将看到更改的值。