Apache camel ApacheCamel为exchange设置了任何关闭挂钩
我正在使用ApacheCamel,并试图找到一种方法,在启动关机(上下文停止)时,如何以我的方式“完成”运行Exchange 例如,当我有一个简单的servlet端点处理任何HTTP请求时,我想截获shutdown并自己完成exchange—比如发送一些带有“Hey the application is stopped(应用程序正在停止)”的自定义HTTP响应 我阅读并研究了ShutdownStrategy、RoutePolicy的代码,但仍然找不到一种方法可以潜入真正的处理(进入exchange/s中的线程) 换句话说,我需要类似于OneException的东西,比如OnShutton。。。并自行处理如何完成交换,而不是让ApacheCamel完成交换,然后杀死它,这可能会导致最终HTTP响应中出现堆栈跟踪,这是不可接受的 如何在所有当前处理的交换中抛出异常,以便我可以使用OneException子句,这也可能会有帮助 我得到的最接近的答复是2011年的答复,其中指出这是不可能的。无论如何,很难相信这么重要的事情是办不到的 唯一一个只能部分工作的解决方案(不是很好)是,在自定义RoutePolicy中,当OneXchangeBeagin发生时,我存储(缓存)了每个exchange,在停止上下文之前,我为每个exchange调用了setException。但这仅在处理器之间进行转换时部分有效。当您只有一个长时间运行的处理器时,它不起作用 部分工程:Apache camel ApacheCamel为exchange设置了任何关闭挂钩,apache-camel,Apache Camel,我正在使用ApacheCamel,并试图找到一种方法,在启动关机(上下文停止)时,如何以我的方式“完成”运行Exchange 例如,当我有一个简单的servlet端点处理任何HTTP请求时,我想截获shutdown并自己完成exchange—比如发送一些带有“Hey the application is stopped(应用程序正在停止)”的自定义HTTP响应 我阅读并研究了ShutdownStrategy、RoutePolicy的代码,但仍然找不到一种方法可以潜入真正的处理(进入exchang
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();
公共类MyRoutePolicy实现RoutePolicy{
//可以使其同步或使用一些锁
公共集合交换=新建ArrayList();
公共集合交换(){
返回交换;
}
@凌驾
public void OneExchange开始(路由、Exchange){
交换。添加(交换);
}
@凌驾
public void onExchangeDone(路由、交换){
交换。移除(交换);
}
//其他方法空体
}
//用我的止损法
for(Exchange:policy.getExchanges()){
setException(新的ShutdownException());
}
context.stop();
//在RouteBuilder中
OneException(ShutdownException.class)
.进程(新处理器(){
@凌驾
公共作废进程(Exchange)引发异常
System.out.println(“我在做我的事情”);
}
})
.已处理(正确)
.停止();
我不认为camel有直接类似的功能,但是,如果您使用的是Spring,那么camel的shutdown依赖于关闭带有'depens-on'属性的springbean。然后SpringBean可以实现一次性关闭,以允许自定义关闭操作。我不认为camel有任何直接类似的功能,但是,如果您使用spring,那么camel的关闭依赖于关闭具有“depends-on”属性的SpringBean。然后Springbean可以实现一次性的,以允许自定义关闭操作。谢谢您的回答。我认为也没有这样的骆驼特征。我想要无框架(除了Camel)解决方案,对吧,似乎没有比我在问题中建议的更好的方法了。我认为你的答案是正确的,因为你确认了这个想法。谢谢!您还可以考虑使用Camel创建解决方案,并在社区维护的pull请求中提供它。谢谢您的回答。我认为也没有这样的骆驼特征。我想要无框架(除了Camel)解决方案,对吧,似乎没有比我在问题中建议的更好的方法了。我认为你的答案是正确的,因为你确认了这个想法。谢谢!您还可以考虑使用Camel创建解决方案,并在社区维护的pull请求中提供它。