Apache Camel中的无限循环

时间:2014-10-09 08:27:47

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

我需要创建一个路由,它会在迭代之间以较小的延迟周期性地调用某个进程。

当我查看循环文档时:

  

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

所以这对我没用,因为我需要做一个无限循环(没有明确指定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

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

2 个答案:

答案 0 :(得分:4)

使用Camel Timer组件:

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

如果fixedRate为false,则不会发生重叠,请参阅Apache Camel timer: "period" vs "fixedRate"

答案 1 :(得分: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");