简介:SpringBoot整合ActiveMQ实战之发布订阅模式(pub/sub),及同时支持点对点和发布订阅模型
1、需要加入配置文件,支持发布订阅模型,默认只支持点对点,这样配置后可支持多个消费者
#default point to point
spring.jms.pub-sub-domain=true
在启动类中配置个默认bean
该部分代码在上一篇博客的基础上实现
生产者代码如下:
业务层
实现类:
//===============发布订阅相关代码================
@Autowired
private Topic topic;
@Override
public void publish(String message) {
jmsTemplate.convertAndSend(topic, message);
}
消费者:实时监听对应的队列:(此处为多个消费者)
package net.xdclass.base_project.jms;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Component
public class TopicConsumer {
@JmsListener(destination = "video.topic")//要监听的队列(实时监听)
public void receive1(String text){
System.out.println("video.topic消费者:receive1=" + text);
}
@JmsListener(destination = "video.topic")//要监听的队列(实时监听)
public void receive2(String text){
System.out.println("video.topic消费者:receive2=" + text);
}
@JmsListener(destination = "video.topic")//要监听的队列(实时监听)
public void receive3(String text){
System.out.println("video.topic消费者:receive3=" + text);
}
}
控制器如下:
//发布消息:生产者
@GetMapping("/topic")
public Object topic(String msg){
producerService.publish(msg);
return JsonData.buildSuccess();
}
浏览器访问:
activeMQ中如下:
解析如下:
Number Of Consumers 消费者 这个是消费者端的消费者数量
Number Of Pending Messages 等待消费的消息 这个是当前未出队列的数量。可以理解为总接收数-总出队列数
Messages Enqueued 进入队列的消息 进入队列的总数量,包括出队列的。 这个数量只增不减
Messages Dequeued 出了队列的消息 可以理解为是消费这消费掉的数量
控制台输出如下:
video.topic消费者:receive2=publish_video_1111
video.topic消费者:receive1=publish_video_1111
video.topic消费者:receive3=publish_video_1111
注意点:
若要同时支持点对点和发布订阅两种模式,则需要修改以下配置,在配置文件中取消下面配置(已注释)
#spring.jms.pub-sub-domain=true
在启动类中添加如下代码
//该段代码可以支持两种模式
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ConnectionFactory activeMQConnectionFactory) {
DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory();
bean.setPubSubDomain(true);
bean.setConnectionFactory(activeMQConnectionFactory);
return bean;
}
修改发布订阅的消费者注解
@JmsListener如果不指定独立的containerFactory的话是只能消费queue消息
修改订阅者container:containerFactory="jmsListenerContainerTopic"
/**
* 消息订阅
* @author wq
*
*/
@Component
public class TopicConsumer {
//需要给topic定义独立的JmsListenerContainer
@JmsListener(destination = "video.topic",containerFactory="jmsListenerContainerTopic")//要监听的队列(实时监听)
public void receive1(String text){
System.out.println("video.topic消费者:receive1=" + text);
}
@JmsListener(destination = "video.topic",containerFactory="jmsListenerContainerTopic")//要监听的队列(实时监听)
public void receive2(String text){
System.out.println("video.topic消费者:receive2=" + text);
}
@JmsListener(destination = "video.topic",containerFactory="jmsListenerContainerTopic")//要监听的队列(实时监听)
public void receive3(String text){
System.out.println("video.topic消费者:receive3=" + text);
}
}
这时候,两种模式均可同时使用