【发布时间】:2015-10-07 05:12:04
【问题描述】:
我正在使用 Apache Camel,我正在尝试找到一种方法,如何在启动关闭(上下文停止)时以我的方式“完成”运行交换。
例如当我有简单的 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();
【问题讨论】:
标签: apache-camel