我有這樣的情況:Apache的駱駝:如果以前的路線運行是不完整不觸發路線
- Apache的駱駝路由是由定時器觸發
- 路線執行大量繁瑣的任務 -
- ,它是當前一次運行仍在進行時,定時器可能再次觸發路線。
我希望我的路線不會在大量任務正在進行時被重新觸發。也就是說,計時器可能會發出事件,但它應該不會導致觸發路線。 當大量任務完成時,定時器應該可以再次啓動路由。
實現此行爲的最佳方法是什麼?
我有這樣的情況:Apache的駱駝:如果以前的路線運行是不完整不觸發路線
我希望我的路線不會在大量任務正在進行時被重新觸發。也就是說,計時器可能會發出事件,但它應該不會導致觸發路線。 當大量任務完成時,定時器應該可以再次啓動路由。
實現此行爲的最佳方法是什麼?
我會創建一個bean來保存路由的運行/完成狀態,並設置狀態的方法和測試狀態的方法。然後,我會做這樣的事情:
<route>
<from uri="timer:...">
<filter>
<method ref="routeStateBean" method="isStopped">
<to uri="bean:routeStateBean?method=routeStarted"/>
....
<to uri="bean:routeStateBean?method=routeStopped"/>
</filter>
</route>
您能否爲上述xml提供java代碼? – rishi
嗯,我的第一個反應是使用無fixedRate
選項timer
的period
選項(即設置fixedRate
選項設置爲false):
所以,聲明:
from("timer:myTask?[other_options]&fixedRate=false")
.to("direct:lengthyProcessingRoute")
應等待任務完成再次觸發定時器之前。
例如,聲明如路線(fixedRate
默認爲false):
from("timer:sender?delay=5s&period=3s")
.log("Ping!")
.delay(5000)
.log("Ping2!");
總是會給輸出:
2016-08-26 12:36:48.130 INFO 5775 --- [ timer://sender] route1 : Ping!
2016-08-26 12:36:53.133 INFO 5775 --- [ timer://sender] route1 : Ping2!
2016-08-26 12:36:53.135 INFO 5775 --- [ timer://sender] route1 : Ping!
2016-08-26 12:36:58.138 INFO 5775 --- [ timer://sender] route1 : Ping2!
然而,這隻會如果你的漫長的處理工作路線本質上是同步的。如果不是,那麼你將不得不做類似於JimNicholson所建議的in his answer。
這是DSL版本已經爲我工作:
private static final AtomicBoolean readyToProcess = new AtomicBoolean(true);
public static boolean readyToProcess() {
boolean readyToProcess = AlarmRouteBuilder.readyToProcess.get();
if (readyToProcess) {
AlarmRouteBuilder.readyToProcess.set(false);
}
return readyToProcess;
}
@Override
public void configure() throws Exception {
from("timer://alarm-poll?period=5s").routeId("alarm-poll")
.log(LoggingLevel.INFO, "Start Timer")
.filter(method(AlarmRouteBuilder.class, "readyToProcess"))
.to("direct:alarm-dostuff")
.end()
.log(LoggingLevel.INFO, "End Timer")
;
from("direct:alarm-dostuff").routeId("alarm-dostuff")
// .process(exchange -> readyToProcess.set(false))
.process(exchange -> doStuff())
.process(exchange -> readyToProcess.set(true))
;
你有什麼要發生,如果路線仍在運行定時器觸發時?應該忽略定時器觸發,以便在下一個定時器觸發時路由運行,或者路由是否應該等待先前的調用完成,然後立即運行? – JimNicholson
@JimNicholson我想忽略 –