上篇文章讲到使用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两种模式
至于第二个问题我们下一篇再说。