Apache camel ApacheCamel为exchange设置了任何关闭挂钩

Apache camel ApacheCamel为exchange设置了任何关闭挂钩,apache-camel,Apache Camel,我正在使用ApacheCamel,并试图找到一种方法,在启动关机(上下文停止)时,如何以我的方式“完成”运行Exchange 例如,当我有一个简单的servlet端点处理任何HTTP请求时,我想截获shutdown并自己完成exchange—比如发送一些带有“Hey the application is stopped(应用程序正在停止)”的自定义HTTP响应 我阅读并研究了ShutdownStrategy、RoutePolicy的代码,但仍然找不到一种方法可以潜入真正的处理(进入exchang

我正在使用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。但这仅在处理器之间进行转换时部分有效。当您只有一个长时间运行的处理器时,它不起作用

部分工程:

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请求中提供它。