【问题标题】:Concurrency with JMS topic in SpringSpring中与JMS主题的并发
【发布时间】:2014-04-17 21:57:42
【问题描述】:

如何在使用spring的jms主题中使用并发?与队列一样,我们可以将 maxConcurrentConsumers 属性设置为所需的数字。但如果我为 JMS 主题这样做,则会导致并发消费同一条消息,这是不可取的。

有人可以指点我正确的方向吗?

【问题讨论】:

  • 主题就是这样运作的。您为您的目的使用了错误类型的 JMS 目标。请改用 JMS 队列目标。
  • 那为什么 ejb 允许呢?实际上,我正在将现有的 ejb 项目迁移到 spring,这就是它在 ejb 中的完成方式。

标签: java concurrency jms jms-topic


【解决方案1】:

嗯,你自己在评论中说的,但只是为了详细说明。

在您的监听器中,您仍然可以创建多个线程并以异步方式执行处理。收到消息后,立即将其发送给异步使用者。例如,这很容易通过某种执行器来实现。

我真的会选择番石榴的 EventBus。它是如此简单,但又如此易于设置和使用。 但这真的是你的选择。

【讨论】:

    【解决方案2】:

    您以错误的方式使用DefaultMessageListenerContainer。来自文档:

    请注意,动态缩放首先只对队列有意义;对于一个主题,您通常会坚持使用默认数量的 1 个消费者,否则您会在同一个节点上多次收到相同的消息。

    为了帮助您解决问题,您可以将主题中的消息转发到队列,并让您​​的消费者从该队列中消费。如果您的 JMS 提供程序具有某些转发功能,那么这仅仅是对您的应用程序的配置更改。

    【讨论】:

    • 正确!但是我们的应用程序非常庞大,我们每小时会收到数千条消息!!此外,有 5 个不同的主题指向同一个侦听器类。特别是在这种情况下,需要并发以使处理快速。由于我无法通过主题来实现这一点,因此我正在考虑更改我的侦听器类的代码(侦听 4 个不同主题的代码)。现在,我正在考虑使用一个任务执行器来实现某种线程逻辑来内部管理处理。如果我错了,请纠正我。谢谢!! :)
    • @user3544133 每小时数千条消息您确实意识到这实际上很少,对吧?
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 2011-07-31
    • 2014-09-15
    • 2014-09-06
    • 1970-01-01
    • 2014-08-23
    • 2011-12-12
    • 2011-08-27
    相关资源
    最近更新 更多