我使用Apache的駱駝和我試圖找到一種方法如何「完成」運行交流我的方式關機(背景站)啓動時。Apache的駱駝任何關閉掛鉤交流
E.g.當我有簡單的servlet端點處理任何HTTP請求時,我想攔截關閉並自己完成交換完成 - 就像發送一些自定義HTTP響應一樣,「嗨應用程序正在停止」。
我閱讀和研究ShutdownStrategy,RoutePolicy的代碼,但仍然無法找到一種方法,我在哪裏可以潛入真正的處理(得到線程交換/秒)。
換句話說,我需要類似於onException的東西,比如onShutdown ...並且自己處理交換應該如何完成,而不是讓Apache Camel完成它然後殺掉它,這可能導致堆棧跟蹤在最後的HTTP響應中是不可接受的。
什麼也有助於可如何拋出異常的所有當前處理的交流方式,所以我可以使用onException的條款。
我得到的最接近的是從2011年this響應其中指出,這是不可能的。無論如何,很難相信這樣的重要事情是無法完成的。
只能部分工作的唯一解決方案(不是很好)只是在自定義RoutePolicy中,當onExchangeBegin發生時和停止上下文之前,我存儲(緩存)了每個交換,我爲每個交換調用了setException。但是這隻在部分處理器之間進行轉換時才起作用。當你有單個長時間運行的處理器時它不起作用。
部分作品:
public class MyRoutePolicy implements RoutePolicy {
// can be made synchronized or utilize some lock
public Collection<Exchange> exchanges = new ArrayList<>();
public Collection<Exchange> getExchanges() {
return exchanges;
}
@Override
public void onExchangeBegin(Route route, Exchange exchange) {
exchanges.add(exchange);
}
@Override
public void onExchangeDone(Route route, Exchange exchange) {
exchanges.remove(exchange);
}
// other methods empty bodies
}
// in my stop method
for (Exchange exchange : policy.getExchanges()) {
exchange.setException(new ShutdownException());
}
context.stop();
// in RouteBuilder
onException(ShutdownException.class)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception
System.out.println("Here I'm doing my stuff");
}
})
.handled(true)
.stop();
感謝您的回答。我認爲沒有這樣的駱駝功能。我希望沒有框架(駱駝除外)解決方案 – d1x
好吧,它似乎沒有比我在問題中提出的更好的方法。我確認你的回答是正確的,你確認了這個想法。 – d1x
謝謝!您還可以考慮使用Camel創建解決方案,並在社區提供的拉取請求中提供該解決方案。 –