Apache Camel任何关闭钩子进行交换

时间:2015-10-07 05:12:05

标签: apache-camel

我正在使用Apache Camel,我正在尝试找到一种方法,以便在启动关闭(上下文停止)时以我的方式“完成”运行交换。

E.g。当我有简单的servlet端点处理任何HTTP请求时,我想拦截关机并自己完成交换 - 比如发送一些自定义HTTP响应“嘿,应用程序正在停止”。

我阅读并研究了ShutdownStrategy,RoutePolicy的代码,但仍然无法找到一种方法,我可以潜入真正的处理(在Exchange / s中获取线程)。

换句话说,我需要类似于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();

1 个答案:

答案 0 :(得分:0)

我不相信骆驼有任何类似的东西,但是,如果你使用的是春天你可以让骆驼关闭取决于关闭一个春天豆与依赖&#39 39;属性。然后spring bean可以实现一次性以允许自定义关闭操作。