首页 > 解决方案 > 单个 ActiveMQ 会话上的多个消费者

问题描述

我有一个 java 应用程序,我需要一些帮助来验证我到目前为止所做的事情!该应用程序具有配置为每 200 毫秒运行一次以轮询 ActiveMQ 队列中的消息的 Quartz 守护程序,每条消息的守护程序处理时间约为 2-3 分钟,当守护程序触发器触发时,另一个线程启动守护程序任务以轮询另一条消息并最多并行处理 50 个线程,所有线程都使用与 ActiveMQ 相同的连接和会话,其中配置了默认Prefetch大小。

你认为这个实现有什么问题吗?谢谢!

标签: multithreadingactivemqquartz-schedulerdaemon

解决方案


假设您喜欢当前的设计并且您只关心实现,那么我看到的唯一关心的原因是javax.jms.Session. 不是线程安全的Session,所以它不应该被多个线程同时访问。Ajavax.jms.Connection是线程安全的,所以这不是问题。为每个消费者创建一个会话可能更安全/更简单。会话非常轻量级,所以我不希望任何真正的性能下降。

为了避免会话并发问题,您甚至可以考虑使用连接池(例如,基于 ActiveMQ 连接池实现的PooledJMS )。

如果您开始遇到消费者饥饿问题,您的预取大小可能是一个问题,但您没有说明您的消息量将是多少,因此很难说这是否会成为问题。要记住两件事:

  • 消息量越大,消费者挨饿的可能性就越小。
  • 消费者处理消息所需的时间越长,其预取大小应该越小。

相应地调整您的预取大小。

关于整体设计,我不禁认为javax.jms.MessageListener这里的实现会更好。单个 MessageListener 可以获取消息并将它们交给线程进行处理。这将避免 Quartz 依赖以及轮询。


推荐阅读