spring boot2.0整合activeMQ,实现p2p和topic两者消息模式兼容共存

上篇文章讲到使用spring boot整合activeMQ,实现ptp和topic两者消息模式,默认情况下是queue模式(也就是p2p),如果要想实现topic需要在配置文件里配上:

# 默认情况下该配置是false,activemq提供的是queue模式,若要使用topic模式需要配置为true
spring.jms.pub-sub-domain=false

上篇文章遗留了两个问题:
1.我提到如何能让这两种模式兼容共存呢?
2.评论区提到的,说开启连接池,启动项目会报错。
接下来我们分别说说这两个情况:

p2p和topic两者消息模式兼容共存

  • 基于springboot2.0+
  • 实际上消费者使用@JmsListener(destination = “queue”)监听队列消息并消费时使用的是默认的监听器:
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(JmsListeners.class)
@MessageMapping
public @interface JmsListener {
    String id() default "";

    String containerFactory() default "";

    String destination();

    String subscription() default "";

    String selector() default "";

    String concurrency() default "";
}
  • 从注解里我们看到处理指定监听的队列之外,我们还可以指定监听容器工厂,如果说我们定义两个监听容器工厂,分别是queue和topic,是不是就可以在项目里兼容共存2种模式了呢?接下来我们试试:
  • 首先我们分别定义queue和topic的监听工厂:
@Bean
public JmsListenerContainerFactory queueListenerFactory(ConnectionFactory connectionFactory) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setPubSubDomain(false);
    factory.setConnectionFactory(connectionFactory);
    return factory;
}
    
@Bean
public JmsListenerContainerFactory topicListenerFactory(ConnectionFactory connectionFactory) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setPubSubDomain(true);
    factory.setConcurrency("1");
    factory.setConnectionFactory(connectionFactory);
    return factory;
}
  • 然后在消费者的注解里指定监听容器工厂:
@JmsListener(destination = "queue",containerFactory = "queueListenerFactory")
public void receiveQueue(String text) {
    log.info("consumer收到queue信息:{}",text);
}

@JmsListener(destination = "topic",containerFactory = "topicListenerFactory")
public void receiveTopic(String text) {
    log.info("consumer收到topic信息:{}",text);
}
  • 到此为止就成功在项目里兼容共存queue和topic两种模式

至于第二个问题我们下一篇再说。

你可能感兴趣的:(activeMQ)