Apache camel 计时器组件如何轮询?

Apache camel 计时器组件如何轮询?,apache-camel,Apache Camel,假设我有以下时间成分: from("timer://foo?period=1000").setBody(constant("select * from customer")).to("jdbc:testdb").to("beanRef:processResult"); 计时器组件在这里是如何工作的?它是每1秒读取一次数据库还是等待bean完成处理 如果bean仍在处理早期的结果,并且计时器将继续轮询数据库,那么它将创建一个瓶颈。有什么办法可以避免吗 好的,更新:查看源代码,计时器组件依赖于ja

假设我有以下时间成分:

from("timer://foo?period=1000").setBody(constant("select * from customer")).to("jdbc:testdb").to("beanRef:processResult");
计时器组件在这里是如何工作的?它是每1秒读取一次数据库还是等待bean完成处理


如果bean仍在处理早期的结果,并且计时器将继续轮询数据库,那么它将创建一个瓶颈。有什么办法可以避免吗

好的,更新:查看源代码,计时器组件依赖于java TimerTask实现。这里已经回答了你的问题:

简短回答:一个线程执行触发器和连接到它的路由,因此不会有并发执行

也就是说,您可能需要稍微控制执行。建议在计时器任务(以及骆驼计时器)中,在计时器中的时间段和最大任务执行时间之间留有余量

您可以在两者之间使用SEDA组件(concurrentConsumers=[num threads])来精细控制工作队列的执行。计时器将立即完成它的任务,而真正的路由可以继续处理

from("timer://foo?period=1000")
    .to("seda:startRoute");

from("seda:startRoute")
    .setBody(constant("select * from customer"))
    .to("jdbc:testdb").to("beanRef:processResult");
每个事件的累积量都会越来越小,因此随着时间的推移,您可能需要调整路由,以便period>avg route exec time

您可以在单例bean或静态类中添加共享布尔变量:

public static synchronized boolean  isRunning(){
    return running;
}

public static synchronized void setRunning(boolean isRunning){
    running = isRunning;
}
变量应告知路由是否正在运行,并过滤变量为true时发生的计时器事件。只需连接几个处理器/bean调用来处理这个问题