【问题标题】:Achieving Fail-safe behaviour in flow在流中实现故障安全行为
【发布时间】:2013-02-01 19:47:20
【问题描述】:

我正在尝试在我的流程中创建一个故障安全场景。

我的流程如下所示。它涉及一些实习生调用网络服务的子流程。 在任何情况下,如果其中一个 Web 服务不可用,则会引发拒绝连接异常并且整个处理将停止。

相反,我想要一个故障安全场景,即使当前的出站调用失败,流也应该继续下一个子流。

是否有任何消息处理器或流控制处理器可以帮助在 Mule 中实现这种行为。

下面是我的抽象流程

<flow name="main_flow" >
    ....
    ....
    <flow-ref  name="subflow_1" />
    ....
    ....
    <flow-ref  name="subflow_2" />
    ....
    ....
    <flow-ref  name="subflow_3" />
    ....
    ....

</flow>

<sub-flow name="subflow_1">
    ....
    ....
    <out-bound call to web-service />
    ....
    ....
</sub-flow>

<sub-flow name="subflow_2">
    ....
    ....
    <out-bound call to web-service />
    ....
    ....
</sub-flow>

<sub-flow name="subflow_3">
    ....
    ....
    <out-bound call to web-service />
    ....
    ....
</sub-flow>

【问题讨论】:

  • 子流交互是否相互依赖?如果没有,您可以将它们并行化,每个都会单独死亡。
  • 他们有点依赖。在每个子流程中,我需要从 web 服务响应中提取一些数据并将其添加到输入 paylaod。然后这成为下一个子流的paylaod。
  • 正如你所说,一个子流的结果成为另一个子流的有效负载,那么调用第二个子流而不接收来自第一个响应的响应将没有多大意义。跨度>
  • @Learner 是对的:如果子流程交互是依赖的,那么如果您无法获取继续所需的数据,为什么还要继续主流程?
  • 正如我所说,它是一种不直接使用浓缩器的浓缩。因为丰富是基于一些逻辑的。它就像输入被保留。在每个子流中,从适合 Web 服务调用的有效负载创建一个请求。然后从响应中提取所需数据并将其丰富到保留的输入有效负载中。然后把这个丰富的paylaod设置为下一部分的paylaod。

标签: java mule flow


【解决方案1】:

您可以通过流实现故障安全行为。

<flow name="main_flow" >
    ....
    ....
    <flow-ref  name="flow_1" />
    ....
    ....
    <flow-ref  name="flow_2" />
    ....
    ....
    <flow-ref  name="flow_3" />
    ....
    ....

</flow>

<flow name="flow_1" processingStrategy="synchronous" >
    ....
    ....
    <out-bound call to web-service />
    ....
    <catch-exception-strategy >
      .... Your FailSafe code to recover. Also you will have the exception here.
     </catch-exception-strategy>
</flow>

通过这种方式,您可以使用流程实现故障安全行为。

快乐编码:)

【讨论】:

    【解决方案2】:

    一个技巧可能是将有效负载存储在一个变量中,有一个&lt;catch-exception-strategy&gt; 块将捕获您的网络服务调用异常,使用&lt;set-payload&gt; 覆盖当前有效负载,然后从@987654324 手动调用sub-flow2 @流sub-flow1

    【讨论】:

    • 这个解决方案我已经试过了。但它变得越来越麻烦。这就是为什么要寻找 Mule 是否有任何可以提供帮助的此类处理器。
    • 子流也没有自己的异常策略。
    • 是的,你必须使用私有流。
    • 非常感谢@Learner。
    【解决方案3】:

    对于每个网络服务调用,使用first-successful 路由器,将您的网络服务调用作为第一个子节点,将回退机制作为第二个子节点。

    【讨论】:

    • 但是如果web-service调用失败,则不需要子流程中web-service调用后的处理。在这种情况下,我的流程应该从 Web 服务调用端点(失败)跳转到我的主要流程,然后继续到其余流程。但是我怎样才能使用 first-successful 呢。
    • 如果webservice调用失败,其余的子流程将不会被执行。相反,first-successful 中的第二个消息处理器将启动,允许您提供 default/fake/null 任何数据以防调用失败。
    • 我能做到。
    • 我对这种方法有疑问。当子流程使用 first-successful 失败时,我将进入下一步。但在此之前,我需要根据异常做一些事情。但我无法掌握异常。知道如何获得例外Paylaod。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多