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

Spring JMS Use Point-to-point and Topic in the same application

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

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

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

jms:
    pub-sub-domain: true

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

有没有办法配置应用程序同时支持主题和队列?

引导属性用于配置@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中的alternate factory

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