首页 > 解决方案 > 在 JMS 队列监听器 onMessage 方法中运行异步代码

问题描述

在我的应用程序中,我将 JMS 消息发布到代表要执行的任务的队列中。当onMessage调用监听器的方法时,我需要执行的任务自动运行在自己的线程中,所以它是异步的。

该应用程序是在 Spring Boot 上编写的,我使用 Kubernetes 进行容器编排,以便动态调整工作进程的数量。

我已经看到了实现这种工作队列和 JMS 侦听器模式的示例,并且我总是看到在方法内部调用同步onMessage方法。

所以,我的问题是:等到异步操作完成后再返回onMessage回调会更好吗?

谢谢

标签: spring-bootjmsmessage-queuespring-jms

解决方案


在侦听器线程上执行异步处理通常不是一个好主意。

如果要增加并发,请改为增加容器的并发(创建多个消费者)。

如果出于某种原因您必须异步,您应该暂停侦听器线程直到进程完成,以避免在发生故障时丢失消息。

此外,如果您退出侦听器,您可能会在当前消息完成之前收到一条新消息。即使使用 CLIENT_ACKNOWLEDGE,您也可以无序地确认消息,或者您必须跟踪未确认的消息。

通常,在侦听器线程上执行工作更简单。


推荐阅读