多线程JMS在Spring中接收

时间:2010-10-29 11:24:12

标签: java spring jms

我正在尝试从队列中编写用于JMS消息处理的多线程实现。

我尝试过使用DefaultMessageListenerContainer和SimpleMessageListenerContainer类。

我遇到的问题是,无论我如何配置它,似乎只是一个MessageListener类的实例被实例化。这迫使我不必要地编写无状态或线程安全的MessageListener实现,因为我将ListenerContainer配置为使用多个线程(concurrentConsumers = 8)。

有一个明显的解决方案,我忽略了吗?

3 个答案:

答案 0 :(得分:5)

这是设计的。 MessageListener是你注入Spring的依赖项 - 它无法实例化新的。

  

这迫使我不必要地编写无状态或线程安全的messageListener实现

你觉得这听起来很糟糕。让MessageListener成为一个非常好的主意,Spring只是消除了做其他事情的诱惑。

答案 1 :(得分:3)

也许这个答案为时已晚,但它可能会让那些正在寻找它的人受益。简而言之,答案是使用CommonsPoolTargetSourceProxyFactoryBean

请查看此链接了解详情:http://forum.springsource.org/showthread.php?34595-MDB-vs-MDP-concurrency

如果您想为主题做类似的事情,请检查:https://stackoverflow.com/a/12668538/266103

答案 2 :(得分:1)

配置“concurrentConsumers”就足以同时处理消息。这并不意味着您将拥有MessageListenerContainer的“n”个实例。 MessageListenerContainer可以在内部跨越“任务”来处理消息。 (可选)您可能必须相应地配置日志记录,以查看与基础任务/线程相关的信息。

有关详细信息,请参阅“Tuning JMS message consumption in Spring”。