如何正确阻止camelContext在独立应用程序中被杀死

时间:2017-02-07 12:29:05

标签: java spring apache-camel activemq

要创建一个消耗ActiveMQ队列的Camel应用程序,我按照本教程编写了一个独立的Camel应用程序: http://camel.apache.org/running-camel-standalone-and-have-it-keep-running.html

区别在于使用camel-spring的Main类而不是camel-core:

我的主要课程:

try {
    Main main = new Main();
    main.setApplicationContextUri("conf/spring-context.xml");

    main.run();
} catch (Exception ex) {
    LOGGER.error(String.format(DifClientConstants.ERROR_START_CLIENT, ex.getMessage()), ex);
}

我在文件spring-context.xml中的camelContext:

...

    <!-- Camel context configuration -->
    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <routeBuilder ref="myRoutes" />
    </camelContext>
...

我通过脚本启动此应用程序,该脚本支持一些命令,例如:start,stop,restart。 对于停止命令,我会终止应用程序的进程。 问题是应用程序与ActiveMQ的连接似乎没有关闭:

WARN  | Transport Connection to: tcp://172.16.x.x:58363 failed: java.net.SocketException: Connection reset | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ Transport: tcp:///172.16.x.x:58363@61616
WARN  | Transport Connection to: tcp://172.16.x.x:58325 failed: java.io.EOFException | org.apache.activemq.broker.TransportConnection.Transport | ActiveMQ Transport: tcp:///172.16.x.x:58325@61616

所以问题是,如何在进程终止关闭时强制Camel应用程序关闭所有连接?

2 个答案:

答案 0 :(得分:2)

Camel提供优雅的关闭功能,以阻止所有消费路线。该策略将允许完成飞行中的消息。

您可以创建一个路径来停止驼峰上下文或暂停它。例如:

@Override
public void process(Exchange exchange) throws Exception {
    exchange.getContext().stop(); 
}


@Override
public void process(Exchange exchange) throws Exception {
    exchange.getContext().suspend(); 
}

您还可以创建一条路线来启动或恢复您的骆驼环境。

@Override
public void process(Exchange exchange) throws Exception {
    exchange.getContext().start(); 
}

@Override
public void process(Exchange exchange) throws Exception {
    exchange.getContext().resume(); 
}

以下是官方文档的链接:http://camel.apache.org/graceful-shutdown.html

答案 1 :(得分:0)

根据Strelok的评论,我检查过并发现该进程被kill -9 (SIGKILL)杀死。我只使用了kill并且执行了骆驼优雅关闭,WARN也没有了。 @Strlok谢谢