5

我现在的情况:

我目前有一个 Mule ESB 应用程序,它具有三个流,它们处理来自两个不同来源的消息,这三个流使用 VM 队列绑定在一起。

流程#1:

入站(端点 #1)->(执行消息处理和转换)-> 出站(端点 #3)

流程#2:

入站(端点 #2)->(执行消息处理和转换)-> 出站(端点 #3)

流#3

入站(端点 #3)->(执行消息处理和转换,做一些事情)-> 出站

问题/问题:

现在我想做的是引入第四个流,流#4,它从入站端点获取状态信息,并基于此信息能够防止流#3 被执行/阻止它处理其入站消息。

换句话说,我最理想的做法是让流#4 在 ESB 应用程序启动时运行(就像所有流似乎自动执行的那样),并根据它从入站消息中获得的状态信息,阻止/允许或启用/禁用 Flow #3 处理来自 Endpoint #3 的消息。

以下是我理想的要求:

要求:

  1. 必须能够单独通过 mule 流 XML 来完成,无需额外的 POJO/自定义 Java 对象。
  2. 流程 #4 必须在 ESB 应用程序启动时执行,并且只需要处理第一条入站消息。
  3. 理想情况下,我不希望 Flow #3 具有复合入站源,或者必须评估每个入站消息的某个全局变量的状态。

完成我想做的事情的最佳方法是什么?

如果没有真正好的解决方案,那么如果我必须省略 #3 要求,那么完成这样一个全局变量的最佳方法是什么,该变量在两个独立的流之间共享,这些流没有被某个出站 - > 入站端点绑定在一起XML 配置?我尝试过使用会话属性,但它们要求将流作为子流或端点绑定在一起。

谢谢。

4

1 回答 1

7

使用全局属性和一些 MEL 表达式来实现这一点:

<global-property name="gate_open" value="true" />

<flow name="gated-flow">
    <vm:inbound-endpoint path="gated.in" />
    <expression-filter expression="#[app.registry.gate_open]" />
    ...
</flow>


<flow name="gate-controller">
    <vm:inbound-endpoint path="gate.in"  />
    <expression-component>
      app.registry.gate_open = false
    </expression-component>
</flow>

发送任何消息vm://gate.in将关闭大门并gated-flow停止处理它收到的消息。

您可以使用任何您想要的协议来代替 VM。

于 2012-08-09T16:23:22.980 回答