Spring JMS在同一应用程序中使用点对点和主题

时间:2019-02-11 12:52:10

标签: java spring-boot jms activemq spring-jms

我们目前正在将ActiveMQ引入我们现有的应用程序中,该应用程序在不同的队列系统上运行。 Spring JMS用于利用Spring框架内的现有集成。

除一个应用程序外,大多数应用程序都使用点对点(队列)通信。它需要能够在同时发布到多个队列的同时侦听另一个正在生产的应用程序创建的主题。

这意味着应用程序需要同时支持主题和队列。但是,设置全局属性时

jms:
    pub-sub-domain: true

此设置为全局设置,所有队列订阅者都立即订阅主题,我们可以在ActiveMQ Web界面中看到该主题。

是否可以将应用程序配置为同时支持主题和队列?

1 个答案:

答案 0 :(得分:1)

boot属性用于配置@JmsListener方法使用的默认容器工厂,以及配置JmsTemplate

只需覆盖Boot的默认容器工厂...

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(
        DefaultJmsListenerContainerFactoryConfigurer configurer,
        ConnectionFactory connectionFactory) {

    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    configurer.configure(factory, connectionFactory);
    return factory;
}

然后添加第二个

@Bean
public DefaultJmsListenerContainerFactory jmsTopicListenerContainerFactory(
        DefaultJmsListenerContainerFactoryConfigurer configurer,
        ConnectionFactory connectionFactory) {

    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    configurer.configure(factory, connectionFactory);
    factory.setPubSubDomain(true); << override the boot property
    return factory;
}

然后请参阅@JmsListener中的备用工厂作为主题。

或者,如果两种类型都没有侦听器,请将属性设置为true,但覆盖Boot的JmsTemplate配置。