第三十一章、整合ActiveMQ之发布订阅模式(SpringBoot2.x)

简介: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);
	}
}

这时候,两种模式均可同时使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荒--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值