如果Camel正在关闭,我如何检查Spring-DSL?

时间:2014-04-25 07:42:35

标签: java apache-camel dsl

我有一个包含wiretap元素的路由,该元素重定向到尝试在一定延迟(大约20秒)后进行bean调用的路由。但是当应用程序关闭时,我会收到错误,因为bean不再存在,并且在关闭期间无法创建。我希望通过在延迟后检查应用程序的状态来优雅地关闭应用程序。我怎么能这样做?

<route id="triggerAfterDelay">
    ...
    <delay><constant>20000</constant></delay>

    <!-- TODO Check if we're not shutting down. -->

    <bean ref="myBean" method="updateAfterDelay"/>
</route>

2 个答案:

答案 0 :(得分:1)

如果您使用的是Camel 2.11.x或更新版本,则可以使用新的ControlBus组件执行此操作。

可能更容易并且在早期的Camel版本中也可用于子类org.apache.camel.support.ServiceSupport。如果myBean扩展ServiceSupport,则必须实现doStop()方法。在那里你可以设置一个标志(AtomicBoolean?)来表示关机正在进行中。在updateAfterDelay()中,您可以检查该标记。

答案 1 :(得分:0)

目前我有一个使用以下过滤器的工作解决方案。不过我仍然对&#34; native&#34;骆驼方式这样做。

public class CamelFilter implements ApplicationContextAware {
    public boolean isMyBeanNotAvailable() {
        boolean notAvailable = false;
        try {
            notAvailable = this.applicationContext.getBean("myBean") == null;
        } catch (BeanCreationNotAllowedException bcnae) {
            notAvailable = true;
        }
        return notAvailable;
    }
}

使用以下路线:

<route id="triggerAfterDelay">
    ...
    <delay><constant>20000</constant></delay>

    <filter>
        <method ref="camelFilter" method="isMyBeanNotAvailable"/>
        <stop/>
    </filter>

    <bean ref="myBean" method="updateAfterDelay"/>
</route>