【问题标题】:Conditionally Exit Camel Loop有条件地退出骆驼循环
【发布时间】:2017-05-18 18:19:42
【问题描述】:

首先我会说我使用的是 Camel 2.14,目前根本不考虑升级。所以我错过了 2.17 中的 doWhile 选项。

我有一个场景,我需要能够让路由在准备好时重复尝试交付给服务实例。一旦成功,我需要退出循环。到目前为止,我已经能够查看指定次数。但是,即使成功,该循环也会继续。

我已经搜索过了,看来我没有太多选择。或者我还是骆驼领域的新手,无法识别我的选择。

<route>
    <from uri="activemq:queue:myQueue" />
    <loop>
        <simple>100</simple>
        <when>
             <simple>${bean:myService?method=isReady}</simple>
             <to uri="bean:myService?method=doWork" />
        </when>
    </loop>
</route>

【问题讨论】:

  • 循环点是不是要加延迟机制?
  • 不,关键是等到服务准备好进行处理。这是一种重试机制,可以反复进行测试以确定就绪状态。
  • 就像@Claus 说的那样,我认为最好的方法是首先检查您的bean 是否准备好并使用队列中的消息。但是,保持这些状态通常很棘手。如果您的 bean 从未准备好会发生什么?你会一直等下去吗?

标签: java apache-camel activemq


【解决方案1】:

您可以在结合 isReady 和 doWork 方法的 java bean 中编写它,而不是使用 Camel 循环。如果您需要循环很长时间,请注意循环不是一个好主意。如果您还没有准备好,最好不要从 AMQ 队列中消费,而是将消息留在存储中。

因此,您可以改为使用路由策略来控制路由以根据就绪状态暂停/恢复。

然后您可以从路由策略中定期检查 isReady,然后相应地暂停/恢复路由。

http://camel.apache.org/routepolicy.html

【讨论】:

    【解决方案2】:

    我遇到了类似的情况,并通过自递归路线解决了这个问题。我不知道这种方法是否有一些缺点。

    <route>
      <from uri="activemq:queue:myQueue" />
      <to uri="direct:loopingRoute"/>
    </route>
    
    <route>
      <from uri="direct:loopingRoute"/>
      <choice>
        <when>
          <method ref="myService" method="isReady"/>
          <bean ref="myService" method="doWork"/>
        </when>
        <otherwise>
          <to uri="direct:loopingRoute"/>
        </otherwise>
      </choice>
    </route>
    


    这是我使用的方法。在回答这个问题时,我想到了一个点。如果递归超出限制,是否会导致stack overflow

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      相关资源
      最近更新 更多