Apache Camel 任何用于交换的关闭钩子

Apache Camel any shutdown hook for exchange

我正在使用 Apache Camel,我正在尝试找到一种方法如何在启动关闭(上下文停止)时 "complete" 运行 交换我的方式。

例如当我有简单的 servlet 端点处理任何 HTTP 请求时,我想拦截关闭并自己完成交换——比如用 "Hey the application is being stopped".

发送一些自定义 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();

我不相信 camel 有类似的东西,但是,如果您使用 Spring,您可以让 camel 的关闭取决于使用 [=12= 关闭 spring bean ] 属性。然后 spring bean 可以实现一次性的以允许自定义关闭操作。