使用线程池的 JMS 侦听器

Posted

技术标签:

【中文标题】使用线程池的 JMS 侦听器【英文标题】:JMS listener using thread pool 【发布时间】:2020-12-25 21:59:45 【问题描述】:

我正在使用一个 Spring 项目,其中我有一个 JMS 事件侦听器的实现来处理来自队列的消息。

准确地说,我使用的是 SQS (AWS) 队列。

一切正常。

我的观点是: 我没有配置任何有关并发性的东西,但我希望有更多线程作为侦听器,以提高队列中消息处理的性能(速度)。

我正在考虑配置线程池(TaskExecutor)并在我的消息处理方法上添加注释@Async。

因此,我将在侦听器中添加一个 onMessage 方法,在消息验证之后,我将调用此异步方法。

这是一个好习惯吗?使用这种方法会有一些问题吗?

我正在网上寻找这个,我发现我可以直接在侦听器上配置并发值。

我很困惑,有很多可能的方法可以做到这一点,我无法理解最好的方法。

这些是等效的解决方案吗?

【问题讨论】:

【参考方案1】:

不要使用@Async - 只需增加监听容器的并发性,spring-jms 会自动为你处理。

【讨论】:

谢谢,你能举个例子吗?我的监听器上没有看到任何并发设置器。使用@Async 是个坏主意吗? docs.spring.io/spring-framework/docs/current/javadoc-api/org/… 使用@Async 在发生故障时会导致消息丢失。 如果我也在使用 AWS SQS 实施,是否可以使用它?我没有 DefaultMessageListenerContainer 我不确定你的意思;看起来它确实使用了它 - 请参阅 here 和 factory.setConcurrency("3-10");

以上是关于使用线程池的 JMS 侦听器的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring 启动和停止 JMS 侦听器

JMS 队列上多线程消息处理的最佳实践

如何配置和启用 JMS 侦听器以根据某些条件使用消息?

如果侦听器关闭,持久性 JMS 消息如何存活

如何使用 Spring JMS 在 ActiveMQ 中创建多个侦听器

Spring Boot JMS 侦听器:无法刷新目标的 JMS 连接