在 JMS 队列侦听器 onMessage 方法中运行异步代码 [关闭]

Posted

技术标签:

【中文标题】在 JMS 队列侦听器 onMessage 方法中运行异步代码 [关闭]【英文标题】:Running asynchronous code inside JMS queue listener onMessage method [closed] 【发布时间】:2021-05-31 10:16:44 【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

您需要在这里概述“更好”的实际含义。在确定一种方法是否比另一种“更好”时,您考虑了哪些标准?这个问题,因为它目前正在构建,将引发讨论和基于意见的答案,而不是基于事实的答案,这意味着它在 Stack Overflow 上是题外话。 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于在 JMS 队列侦听器 onMessage 方法中运行异步代码 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

从 JMS 队列中批量获取

JMS 是不是有队列窥视的概念?

Spring----监听器容器

使用线程池的 JMS 侦听器

Spring JMS 监听器中的事务管理

WSO2 ESB 5.0.0 配置 JMS 传输(ActiveMQ)- 队列消息生产与消费