【问题标题】:Spring JMS Message Listener ContainerSpring JMS 消息侦听器容器
【发布时间】:2012-06-26 14:13:05
【问题描述】:
我是 JMS 的新手,我正在使用 Tomcat 6 和 Spring 设置 ActiveMQ。我已经配置了大部分基本的东西,但是我对 Spring 提供的 Message Listener Containers 有点困惑。阅读文档,听起来消息侦听器容器用于“处理”订阅(我正在使用主题)、取消订阅并将消息传递给侦听器。我不确定我是否正确地考虑了这一点。如果是这种情况,我看不到任何有关如何让多个类使用消息侦听器容器订阅同一主题的文档。我看到您可以设置 messageListener 属性,但这只会允许一个类能够订阅一个主题。创建同一个消息侦听器容器的另一个实例只是为了让另一个订阅者(消息驱动 POJO)收听同一个主题似乎是不正确的。
谁能帮我解释一下?我想我可能有点困惑。
提前致谢!
【问题讨论】:
标签:
java
spring
tomcat
jms
activemq
【解决方案1】:
如果您熟悉消息驱动的 EJB,那么 Spring MessageListenerContainer 可以有效地替代 MDB。它之所以得名,是因为它与 JMS 主题/队列以及单个 JMS 消息侦听器相连,它从该主题/队列中提取消息并将它们提供给您的消息侦听器。
您说得对,每个容器一次只能注册一个 MessageListener,但请考虑到 MessageListenerContainer 代码可能非常复杂,但它实际上是一个非常轻量级的运行时组件。不要害怕创建它的多个实例。
另外,请确保为您的情况选择合适的 MessageListener 实现。 Simple 和 Default 实现确实有很大不同,但都不是“更好”。
【解决方案2】:
伙计们说多个容器可以帮助你是正确的,但它看起来像是错误的方法。由于 JMS 的目标是集成不同的应用程序/服务而不是内部应用程序进程(您谈论的几个类)。我建议在消息侦听器收到消息后自己将消息推送到不同的类。否则,您可以看看 Apache Camel 或 Spring Integration 等框架。
【解决方案3】:
容器是一种包装器,可以“适应”任何 POJO 以接收来自队列或主题的消息。如果你想要多个监听器,你最终会得到多个容器。