【问题标题】:Infinite loop in Apache CamelApache Camel 中的无限循环
【发布时间】:2014-12-04 02:33:05
【问题描述】:

我需要创建一个路由,它会定期调用一些进程,在迭代之间有一个小的延迟。

当我查看循环文档时:

循环允许处理消息多次,每次迭代可能采用不同的方式。主要在测试期间有用。

所以这对我没有用,因为我需要做一个无限循环(没有明确指定CamelLoopSize)。

我的第二个想法是使用一种“递归”:

from("direct:updateLoop").routeId("updateLoop")
  .process(someProcess)
  ...
  .filter(someFilter)  // Can be used to stop the workflow
  .delay(18000000)  // Wait 5 hours and start again
  .to("direct:updateLoop")

这在几天内运行良好,但是在大约 600 次迭代后,StackOverflowException 失败

有没有更好的方法让我的进程无限循环运行?

【问题讨论】:

  • 为什么不使用石英或计时器组件?
  • 因为我无法提前确定完成该过程需要多长时间。该过程可能需要几分钟或几天才能完成。当我只设置一个计时器时,会有可能同时处理同一个数据集。设置延迟更适合我的用例。
  • 轮询消费者模式怎么样?

标签: recursion apache-camel stack-overflow infinite-loop integration-patterns


【解决方案1】:

使用Camel Timer组件:

from("timer://foo?fixedRate=false&period=18000000")
     .process(someProcess);

如果fixedRate为假,则不会发生重叠,见Apache Camel timer: "period" vs "fixedRate"

【讨论】:

    【解决方案2】:

    对于递归,您可以使用骆驼的seda 组件。

    from("seda:updateLoop").routeId("updateLoop")
        .process(someProcess)
        ...
        .filter(someFilter)  // Can be used to stop the workflow
        .delay(18000000)  // Wait 5 hours and start again
        .to("seda:updateLoop");
    

    【讨论】:

    • 我投了赞成票,因为它是真正长时间处理的解决方案 - 我的意思是我有很多数据,这些数据使用骆驼从目的地 A 传输到目的地 B,直到 A 中有东西。这导致了 stackoverflow ,只是因为堆栈太长(没有递归!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多