单个ActiveMQ会话上有多个使用者

时间:2019-01-21 09:17:24

标签: multithreading activemq quartz-scheduler daemon

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

您认为此实现有什么问题吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

假设您喜欢当前的设计,而您只关心实现,那么我在这里关心的唯一原因是javax.jms.Session的任何可能的并发访问。 Session不是线程安全的,因此绝对不能同时有多个线程访问它。 javax.jms.Connection是线程安全的,因此不必担心。为每个消费者创建一个会话可能更安全/更简单。会话非常轻巧,因此我不希望任何实际的性能下降。

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

如果您开始遇到消费者饥饿问题,则您的预取大小可能会成为问题,但是您并未指出消息量将是多少,因此很难确定是否会出现这种情况。是否有问题。请记住两件事:

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

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

关于总体设计,我不禁想到这里使用javax.jms.MessageListener实现会更好。单个MessageListener可以获取消息并将它们传递给线程进行处理。这样可以避免Quartz依赖性和轮询。