我使用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();
感谢您的回答。我认为没有这样的骆驼功能。我希望没有框架(骆驼除外)解决方案 – d1x
好吧,它似乎没有比我在问题中提出的更好的方法。我确认你的回答是正确的,你确认了这个想法。 – d1x
谢谢!您还可以考虑使用Camel创建解决方案,并在社区提供的拉取请求中提供该解决方案。 –