Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java [spring]DefaultShutdownStrategy、[camel]shutdownsaware和[camel]Processor donds的组合';t工作_Java_Spring_Apache Camel_Application Shutdown - Fatal编程技术网

Java [spring]DefaultShutdownStrategy、[camel]shutdownsaware和[camel]Processor donds的组合';t工作

Java [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

我有一个camel
处理器
,它正在启动
线程
处理器
实现spring
ShutdownAware
当我向应用程序发送
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 {
...
}