Java [spring]DefaultShutdownStrategy、[camel]shutdownsaware和[camel]Processor donds的组合';t工作
我有一个camelJava [spring]DefaultShutdownStrategy、[camel]shutdownsaware和[camel]Processor donds的组合';t工作,java,spring,apache-camel,application-shutdown,Java,Spring,Apache Camel,Application Shutdown,我有一个camel处理器,它正在启动线程 此处理器实现springShutdownAware 当我向应用程序发送TERM信号(正常关机)时,我没有收到任何有关的信息-调用了ShutdownAware接口的任何方法。 我提到了线程,因为我想正确地停止它 import org.apache.camel.Processor; import org.apache.camel.spi.ShutdownAware; public class MyProcessor implements Processor
处理器
,它正在启动线程
此处理器
实现springShutdownAware
当我向应用程序发送TERM
信号(正常关机)时,我没有收到任何有关的信息-调用了ShutdownAware
接口的任何方法。
我提到了线程
,因为我想正确地停止它
import org.apache.camel.Processor;
import org.apache.camel.spi.ShutdownAware;
public class MyProcessor implements Processor, ShutdownAware {
...
}
我应该以某种方式注册这个处理器吗?ShutdownAware还是什么?ShutdownAware是驼峰接口,而不是Spring 如果
MyProcessor
是一个Springbean,那么它可以实现DisposableBean
,或者有一个@PreDestroy
方法,或者用Spring理解的在上下文关闭时调用的东西进行注释
如果您使用的是XML,您可以这样做
<bean class="...MyProcessor" destroy-method="shutdown"/>
当然,MyProcessor
将需要一种shutdown
方法;ShutdownAware
中的任何内容似乎都不合适
Spring上下文是如何创建的?也许您需要注册关闭钩子,例如:context.registerShutdownHook()代码>参见
实际上,解决这个问题的方法是让CamelContext
知道Spring正在关闭。然后应该通知处理器。解决方案是:
import org.apache.camel.Processor;
import org.apache.camel.Service;
import org.apache.camel.spi.ShutdownAware;
public class MyProcessor implements Processor, ShutdownAware, Service {
...
}
然后,即使在关闭期间start()
,stop()也会调用ShutdownAware
中的方法
不使用“服务”接口中的方法。是的,您可以在处理器
类中扩展服务支持
或实现服务
,然后Camel将在启动/停止时调用doStart
/doStop
方法作为生命周期的一部分。更多信息请访问:谢谢您的回答。那么,ShutdownAware
/如何使用它呢?ShutdownAware
的javadoc说,这主要是为内存消费者提供一个机会,确保他们的挂起的交换在关机期间不会丢失。好的,我明白了。当我在代码中添加服务
接口时,看起来一切都很好。
import org.apache.camel.Processor;
import org.apache.camel.Service;
import org.apache.camel.spi.ShutdownAware;
public class MyProcessor implements Processor, ShutdownAware, Service {
...
}