骡子3:控制是否允许执行流程

时间:2012-08-09 14:01:12

标签: esb mule

我目前的情况:

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

流量#1:

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

流量#2:

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

流程#3

入站(终点#3) - > (执行消息处理和转换,执行操作) - >外向

问题/问题:

现在我要做的是引入第四个流程,即Flow#4,它从入站端点获取状态信息,并根据此信息阻止流#3被执行/阻止它处理其入站消息。

换句话说,我理想的是让Flow#4在ESB应用程序启动时运行(就像所有流程似乎都自动执行),并基于它从入站消息中获取的状态信息,阻止/允许或启用/禁用流#3来处理来自端点#3的消息。

以下是我理想的要求:

要求:

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

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

    感谢。

1 个答案:

答案 0 :(得分: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。