假设我有以下时间组件:
from("timer://foo?period=1000").setBody(constant("select * from customer")).to("jdbc:testdb").to("beanRef:processResult");
计时器组件如何在这里工作?它是每 1 秒从数据库读取一次还是等待 bean 完成处理?
如果 bean 仍在处理较早的结果,并且计时器将继续轮询数据库,那么它将产生瓶颈。有什么办法可以避免吗?
假设我有以下时间组件:
from("timer://foo?period=1000").setBody(constant("select * from customer")).to("jdbc:testdb").to("beanRef:processResult");
计时器组件如何在这里工作?它是每 1 秒从数据库读取一次还是等待 bean 完成处理?
如果 bean 仍在处理较早的结果,并且计时器将继续轮询数据库,那么它将产生瓶颈。有什么办法可以避免吗?
好的,更新:查看源码,定时器组件依赖于java TimerTask 实现。您的问题已经在这里得到解答:Java 的 Timer 任务是否保证不会同时运行?
简短的回答:一个线程执行触发器和连接到它的路由,所以不会有并发执行。
也就是说,您可能想稍微控制一下执行。建议使用 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");
每个事件都会堆积得越来越少,因此随着时间的推移,您可能需要调整路由,以便 period > avg route exec time。
您可以在单例 bean 或静态类中添加共享布尔变量:
public static synchronized boolean isRunning(){
return running;
}
public static synchronized void setRunning(boolean isRunning){
running = isRunning;
}
变量应该告诉天气路线是否正在运行,并过滤在变量为真时发生的计时器事件。只需连接一些处理器/bean 调用来处理这个问题。