2015-10-07 47 views
1

我使用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(); 

回答

0

我不相信駱駝有什麼直接這樣的,但是,如果你正在使用Spring,你可以有駱駝的關閉取決於關停的Spring bean與「depends-在'屬性上。然後,Spring bean可以實現一次性以允許自定義關機操作。

+0

感謝您的回答。我認爲沒有這樣的駱駝功能。我希望沒有框架(駱駝除外)解決方案 – d1x

+0

好吧,它似乎沒有比我在問題中提出的更好的方法。我確認你的回答是正確的,你確認了這個想法。 – d1x

+0

謝謝!您還可以考慮使用Camel創建解決方案,並在社區提供的拉取請求中提供該解決方案。 –