And*_*s_D 6 java queue jms message-listener
我目前正在向类似应用程序服务器的框架添加JMS支持.JMS将由HornetQ(独立代理,服务器类路径上的hornetq jars)实现,但既没有JBoss也没有spring,也没有其他任何可以提供MDB的东西.
下一步是将消息侦听器添加到xa队列,以允许并行处理传入消息.有些消息会初始化长时间运行的任务,因此基本思路是从onMessage方法中生成工作线程.
在我漫长的互联网旅程中,我遇到了这个讨论,其中一位参与者提到,他不会这样做,而是使用额外的内部队列来完成任务:(单线程)消息监听器然后只需从中获取消息入站队列并为内部队列创建新消息,在该内部队列的另一端,一些工作线程争用传入消息.一旦它们被"复制"到内部队列(这对我来说没问题),入站消息就会被确认.
不幸的是,他们没有说为什么不从该onMessage方法产生工作线程更好- 也许,因为如果池中的所有线程都忙,则监听器会阻塞.所以我在寻找设计决策的优缺点:
撇开事务限制不谈,是否有多个线程(或进程)从队列中读取数据只是取决于消息顺序是否重要。显然,如果顺序很重要,那么单个线程自然会维护该顺序,而多个线程则不会提供这样的保证。
您通常会发现,顺序很重要,但跨越所有消息的子集。在这种情况下,如果单个线程性能不佳,您需要将这些消息从队列中取出并在尽可能短的时间内重新排队,因为为了保留顺序,您必须使用单个线程从初始消息中读取消息队列 - 因此使用一个或多个内部队列。这样做带来的问题是,事务将在消息完全处理之前关闭,因此您需要某种临时存储来确保如果进程在处理发生之前失败,消息不会被丢弃。
如果,正如您的问题所暗示的,您不太担心丢失消息,那么听起来java.util.concurrent.BlockingQueue就像您需要一个内部队列,每个队列都有一个线程服务。
| 归档时间: |
|
| 查看次数: |
7367 次 |
| 最近记录: |