我有一个包含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>
答案 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>