单个 ActiveMQ 会话上的多个消费者

Multiple consumers on single ActiveMQ session

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

你觉得这个实现有什么问题吗? 谢谢!

假设您喜欢当前的设计并且您只关心实现,那么我在这里看到的唯一担心的原因是 javax.jms.Session 的任何可能的并发访问。 Session 不是线程安全的,因此绝不能同时被多个线程访问。 javax.jms.Connection 是线程安全的,所以这不是问题。只为每个消费者创建一个会话可能是 safer/simpler。会话非常轻量级,所以我预计不会有任何真正的性能下降。

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

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

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

相应地调整预取大小。

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