一、订阅模式
生产者产生一条消息message放入一个topic中,该topic已经三个消费者订阅了,那么被放入topic中的这条消息,就会同时被这三个消费者取走(当然他们必须都处于在线状态),并进行“消费”。其实就类似现实生活中的手机接收推送。
二、订阅模式的使用场景
发布订阅模式下,当发布者消息量很大时,显然单个订阅者的处理能力是不足的。实际上现实场景中是多个订阅者节点组成一个订阅组负载均衡消费topic消息即分组订阅,这样订阅者很容易实现消费能力线性扩展。可以看成是一个topic下有多个Queue,每个Queue是点对点的方式,Queue之间是发布订阅方式。
三、实战操作
1、需要加入配置文件,支持发布订阅模型,默认只支持点对点
#default point to point
spring.jms.pub-sub-domain=true
2、springboot启动类中添加
@Bean //交给spring来管理,注入哦!
public Topic topic(){
return new ActiveMQTopic("tv.topic");
}
3、接口
//发布消息
public void publish(String msg);
4、接口实现的类
//=======发布订阅相关代码=========
//注入指定订阅 (在启动类中有注入哦!)
@Autowired
private Topic topic;
@Override
public void publish(String msg) {
jmsTemplate.convertAndSend(this.topic,msg); //指定主题消息队列哦!!!
}
5、消费者类
/**
*消费者
*/
@Component
public class TopicSub {
//实时监听器监听order.queue这个消息队列
@JmsListener(destination = "tv.topic")
public void receiveTopic1(String text){
System.out.println("TopicSub 消费者1 收到的消息为:"+text);
}
@JmsListener(destination = "tv.topic")
public void receiveTopic2(String text){
System.out.println("TopicSub 消费者2 收到的消息为:"+text);
}
@JmsListener(destination = "tv.topic")
public void receiveTopic3(String text){
System.out.println("TopicSub 消费者3 收到的消息为:"+text);
}
}
6、控制器类
发布/订阅///
@GetMapping("topic")
public Object topic(String msg) {
//调用方法
service.publish(msg);
return JsonData.buildSuccess();
}
7、启动运行
请求处理完毕后,topic中的出队列数为3,入队列数为1,证明这条消息分别被3个消费者消费了: