Mule ASYNC范围与VM

时间:2014-10-07 10:24:15

标签: asynchronous mule

有人可以帮我理解异步范围和骡子中的vm之间的区别。我理解vm就像在内存JMS中,但如果我的要求是异步处理某些东西,我可以随意使用它们吗?如果没有,有什么区别。

例如,以下内容可能有什么区别:

主流程1使用异步范围调用另一个流程:

<flow name="mainflow1">
...
<async>
  <flow-ref name="anotherflow" /> 
</async>
...
</flow>

主流程2使用VM调用另一个流程:

<flow name="mainflow2">
...
<outbound-endpoint address="vm://anotherflow" exchange-pattern="one-way" />
..
</flow>

假设另一个流将记录写入某个数据库,而不是请求 - 响应类型。还有线程安全性如何。两个完全线程都安全吗?

2 个答案:

答案 0 :(得分:4)

马特的回答是正确的。我可能会为通过队列而不是仅仅调用另一个流来获得额外的成本而增加一些额外的好处:

  1. 使用VM出站端点(或实际上,任何队列),您可以在临时高负载下排队消息,并控制当目标流可以消耗的消息数超过消息时发生的情况(最大未完成消息) ,当你达到最大值时要做什么,在你出错之前等待发布成功的时间等等)。这是SEDA

  2. 的目的
  3. 在使用者端,使用队列而不是流引用允许您使用事务来确保您不使用该消息,除非您的预期处理成功。

  4. VM队列提供了一个方便的位置,可以单独测试应用程序的各个部分。您可以在功能测试中使用MuleClient从VM队列发送或接收消息,以确保您的流程正常工作。

答案 1 :(得分:3)

两者之间的主要区别在于流程的背景。使用虚拟机端点时,mule会将消息视为全新的传入消息。它有一个全新的上下文和单独的属性和变量。如果要从调用流继承属性和变量,可以使用flow-ref来调用流或子流(有关流和子流之间的差异,请参见此处:http://www.mulesoft.org/documentation/display/current/Flows+and+Subflows)。由于vm端点创建了一个新的上下文,因此调用中有更多的开销并且效率较低,但是由于额外的开销,您可以获得完整的mule调用所带来的所有基础结构。