2015-10-07 48 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创建解决方案,并在社区提供的拉取请求中提供该解决方案。 –