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

Java JMS队列上多线程消息处理的最佳实践,java,queue,jms,message-listener,Java,Queue,Jms,Message Listener,我目前正在向类似于应用服务器的框架添加JMS支持。JMS将由HornetQ(独立代理,服务器类路径上的hornetqjar)实现,但既没有JBoss,也没有spring,也没有其他任何东西可以提供mdb 下一步是将消息侦听器添加到xa队列,以允许并行处理传入消息。有些消息会初始化长时间运行的任务,因此基本思想是从onMessage方法中生成工作线程 在我漫长的互联网之旅中,我遇到了一位参与者,其中一位参与者提到,他不会这样做,而是使用一个额外的内部队列来完成任务:然后(单线程)消息侦听器只需从入

我目前正在向类似于应用服务器的框架添加JMS支持。JMS将由HornetQ(独立代理,服务器类路径上的hornetqjar)实现,但既没有JBoss,也没有spring,也没有其他任何东西可以提供mdb

下一步是将消息侦听器添加到xa队列,以允许并行处理传入消息。有些消息会初始化长时间运行的任务,因此基本思想是从
onMessage
方法中生成工作线程

在我漫长的互联网之旅中,我遇到了一位参与者,其中一位参与者提到,他不会这样做,而是使用一个额外的内部队列来完成任务:然后(单线程)消息侦听器只需从入站队列抓取消息,并为内部队列创建新消息,其中,在该内部队列的另一端,一些工作线程争夺传入消息。入站消息一旦“复制”到内部队列(这对我来说没问题),就会被确认

不幸的是,他们没有说为什么不从
onMessage
方法中生成工作线程更好——可能是因为如果池中的所有线程都很忙,侦听器就会阻塞。因此,我正在寻找设计决策的利弊:

  • 从消息侦听器的onMessage方法启动工作线程
  • 使用内部队列“向工作线程发送消息”

撇开事务限制不谈,是否让多个线程(或进程)从队列中读取只取决于消息顺序是否重要。显然,如果顺序很重要,那么单个线程自然会维持该顺序,而多个线程不会提供这样的保证

您通常会发现,顺序很重要,但它跨越了所有消息的子集。在这种情况下,如果单个线程无法执行,则需要将这些消息从队列中取出,并在尽可能短的时间内重新排队,因为为了保持顺序,必须使用单个线程读取初始队列,因此需要使用一个或多个内部队列。由此产生的问题是,事务将在消息完全处理之前关闭,因此您需要某种临时存储,以确保在处理发生之前,如果进程将崩溃,消息不会被丢弃

如您的问题所示,如果您不太担心丢弃消息,那么
java.util.concurrent.BlockingQueue
听起来像是内部队列所需要的,每个队列都有一个线程