【问题标题】:Apache Camel any shutdown hook for exchangeApache Camel 任何用于交换的关闭挂钩
【发布时间】: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


    【解决方案1】:

    我不相信骆驼有任何直接类似的东西,但是,如果您使用的是 Spring,您可以让骆驼的关闭依赖于关闭具有“依赖”属性的 Spring bean。然后spring bean可以实现disposable以允许自定义关闭操作。

    【讨论】:

    • 感谢您的回答。我认为也没有这样的骆驼功能。我想要无框架(Camel 除外)的解决方案
    • 好吧,似乎没有比我在问题中建议的方法更好的方法了。我将您的答案标记为正确,因为您确认了这个想法。
    • 谢谢!您还可以考虑使用 Camel 创建解决方案,并在拉取请求中提供它以由社区维护。
    猜你喜欢
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多