Timer组件如何轮询?

时间:2012-06-04 18:21:39

标签: apache-camel

假设我有以下时间成分:

from("timer://foo?period=1000").setBody(constant("select * from customer")).to("jdbc:testdb").to("beanRef:processResult");

计时器组件如何在这里工作?它是否每1秒从数据库中读取一次,或者等待bean完成处理?

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

1 个答案:

答案 0 :(得分:2)

好的,更新:查看源代码,timer组件依赖于java TimerTask实现。您的问题已在此处得到解答:Is Java's Timer task guarenteed not to run concurrently?

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

那就是说,你可能想稍微控制执行。建议使用Timer Tasks(以及Camel定时器)在定时器的周期和最大任务执行时间之间保留一个余量。

您可以在其间使用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");

每个事件都会堆积起来,所以随着时间的推移,你可能需要调整路线,以便周期>平均路线执行时间。

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

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

public static synchronized void setRunning(boolean isRunning){
    running = isRunning;
}

变量应告知天气路线是否正在运行,并过滤变量为真时发生的定时器事件。只需连接几个处理器/ bean调用来处理这个问题。