gpt4 book ai didi

java - 安全终止 Spring JMS 应用程序

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:15:02 25 4
gpt4 key购买 nike

我正在开发一个 Spring boot JMS 应用程序,该应用程序严格使用 bean 注释设置并从 WebshpereMQ 读取消息。一切正常,只是我不知道如何安全地关闭此应用程序。一旦我的 JMSListener 方法读取了所有消息,它就保持空闲状态。我与队列建立初始连接并访问队列深度,因此理想情况下,当队列深度为零时,它需要将其包装起来并关闭。我当前的解决方法(我根本不喜欢它)是我在深度为零时调用的这个小方法(从监听器内部,yikes):

public void shutDownApplication() {
logger.info("Initiating shutdown of application...");
System.out.println("Terminating application...");
Thread.currentThread().interrupt();
System.exit(0);
}

我不喜欢这个解决方案。 Spring 也没有,因为这显然在进程中作为错误中断,在应用程序终止之前,我的 JMSListener 启动回滚并将最后一条剩余消息放回队列中。

在查看以下资源后,我尝试了一些其他解决方案:

How can I Stop/start/Pause a @JmsListener (the clean way)

How to gracefully shut down a Spring JMS MessageListenerAdapter

http://forum.spring.io/forum/spring-projects/integration/jms/124980-graceful-shutdown-of-jms-message-listener

这是我最近的解决方案:

public class JMSShutdownService {

public void initiateShutdown() {
JmsListenerEndpointRegistry jmsListenerEndpointRegistry = new JmsListenerEndpointRegistry();
Collection<MessageListenerContainer> col = jmsListenerEndpointRegistry
.getListenerContainers();
for (MessageListenerContainer cont : col) {
cont.stop(Thread.currentThread());
}
System.exit(0);
}

}

这会终止应用程序,但仍会将最后一条消息放回队列中。我仍在努力理解 Spring 的许多错综复杂之处,所以这一切都归结为这一点。我觉得主要问题是它在我发出关闭信号的监听器内部。据我所知,听众不应该对此负责。但我不确定如何定义一种在监听器启动之前关闭应用程序的方法,或者如何在队列深度为零时弹出监听器。

有什么想法吗?

最佳答案

JmsListenerEndpointRegistry jmsListenerEndpointRegistry = new JmsListenerEndpointRegistry();

那没用;新注册表不会有任何容器,如果您使用的是 @JmsListener,则需要从应用程序上下文中获取注册表。

System.exit(0);

这只会杀死 JVM。

底线是你应该在不同的线程上停止容器——使用任务执行器启动一个新线程来停止容器;容器将等待线程在停止之前退出监听器。

停止容器后,您需要等待一段宽限期,然后才能终止 JVM。

你怎么知道你真的完成了?停止容器后可能会显示另一条消息,在这种情况下,您可能会在日志中看到一些关于消息因容器正在停止而被拒绝的噪音。

编辑

在我的听众中...

...
if (timeToShutDown()) {
Executors.newSingleThreadExecutor.execute(new Runnable() {

public void run() {
stopTheContainer();
}
}
}
// exit the listener so the container can actually stop.

关于java - 安全终止 Spring JMS 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37077787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com