产自:后端三郎
时间:刚刚
参考:B站编程不良人
目录
pom.xml导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
Springboot集成了RabbitMQ,为我们提供了 RabbitTemplate 工具包,极大的简化了我们的操作
在Controller注入RabbitTemplate
@Autowired
private RabbitTemplate rabbitTemplate;
application.yml配置
spring:
rabbitmq:
#地址
host: 127.0.0.1
#端口
port: 5672
#账号
username: guest
#密码
password: guest
//虚拟主机
virtual-host: /zyj
第一种模式:直连
生产者代码
生产者和消费者写完后,启动项目,访问/test/testRabbitMq接口,往队列中添加数据
@RestController
@RequestMapping(value = "/test")
public class TestController {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* @Description:测试直连RabbitMq
* @Author: ZhaoYaJun
* @Date: 2022/01/05
*/
@GetMapping(value = "/testRabbitMq")
//此注解为swagger注解,不用可以注释掉
@ApiOperation(value = "测试RabbitMq",httpMethod = "GET",notes = "测试RabbitMq")
public void testRabbitMq() {
rabbitTemplate.convertAndSend("hello", "hello word");
}
}
消费者代码
//代表监听队列
@RabbitListener
value :队列名称
durable :是否持久化
exclusive :是否独占
autoDelete :是否自动删除
//代表消费者回调方法
@RabbitHandler
message代表队列中的消息
@Component
//监听队列 关于队列的相关设置也在此处设置 常用的配置---默认的是 持久化的true,非独占的false,不是自动删除的队列false,下边只是把常用的配置默认的写出来了
@RabbitListener(queuesToDeclare = @Queue(value = "hello",durable = "true",exclusive = "false", autoDelete = "false"))
public class Customer1 {
//注解代表回调方法
@RabbitHandler
public void receivel(String message){
System.out.println("message=="+message);
}
}
测试结果(单独启动生产者的时候rabbitmq不会创建队列,有了消费者监听才会创建队列)
第二种模型:work quene
使用for循环往队列里面放多条消息,创建多个消费者,下边案例用了两个
生产者代码
/**
* @Description:测试work quene RabbitMq
* @Author: ZhaoYaJun
* @Date: 2022/01/05
*/
@GetMapping(value = "/testRabbitMq")
//此注解为swagger注解,不用可以注释掉
@ApiOperation(value = "测试RabbitMq",httpMethod = "GET",notes = "测试RabbitMq")
public void testRabbitMq(){
for (int i = 0; i <2 ; i++) {
rabbitTemplate.convertAndSend("hello","hello word");
}
}
消费者代码(@RabbitListener可以加在方法上)
//监听队列 关于队列的相关设置也在此处设置 常用的配置---默认的是 持久化的true,非独占的false,不是自动删除的队列false,下边只是把常用的配置默认的写出来了
@RabbitListener(queuesToDeclare = @Queue(value = "hello",durable = "true",exclusive = "false", autoDelete = "false"))
public void receive1(String message){
System.out.println("message1=="+message);
}
//监听队列 关于队列的相关设置也在此处设置 常用的配置---默认的是 持久化的true,非独占的false,不是自动删除的队列false,下边只是把常用的配置默认的写出来了
@RabbitListener(queuesToDeclare = @Queue(value = "hello",durable = "true",exclusive = "false", autoDelete = "false"))
public void receive2(String message){
System.out.println("message2=="+message);
}
测试结果
第三种模型:fanout
实现一条消息多个消费者消费
生产者代码
/**
* @Description:测试fanout模型RabbitMq
* @Author: ZhaoYaJun
* @Date: 2022/01/05
*/
@GetMapping(value = "/testRabbitMq")
//此注解为swagger注解,不用可以删掉
@ApiOperation(value = "测试RabbitMq",httpMethod = "GET",notes = "测试RabbitMq")
public void testRabbitMq(){
rabbitTemplate.convertAndSend("zyj","","fanout模型");
}
消费者代码
//监听队列 bindings属性,交换机和对接进行绑定
@RabbitListener(bindings = {
@QueueBinding(value = @Queue,//临时队列
exchange = @Exchange(value = "zyj",type = "fanout"))//绑定交换机
})
public void receive3(String message){
System.out.println("message3=="+message);
}
//监听队列 bindings属性,交换机和对接进行绑定
@RabbitListener(bindings = {
@QueueBinding(value = @Queue,//临时队列
exchange = @Exchange(value = "zyj",type = "fanout"))//绑定交换机
})
public void receive4(String message){
System.out.println("message4=="+message);
}
测试结果
第四种模型:Routing又名direct
发送消息的时候附加Routing key,通过key选择对应的消费者
下边ky设置为 info
生产者代码
/**
* @Description:测试direct模型RabbitMq
* @Author: ZhaoYaJun
* @Date: 2022/01/05
*/
@GetMapping(value = "/testRabbitMq")
//此注解为swagger注解,不用可以删掉
@ApiOperation(value = "测试RabbitMq",httpMethod = "GET",notes = "测试RabbitMq")
public void testRabbitMq(){
rabbitTemplate.convertAndSend("directs","info","direct模型");
}
消费者代码
//监听队列 bindings属性,交换机和对接进行绑定
@RabbitListener(bindings = {
@QueueBinding(value = @Queue,//临时队列
exchange = @Exchange(value = "directs",type = "direct"),//绑定交换机
key = {"info"})//绑定key,可以绑定多个key
})
public void receive5(String message){
System.out.println("message5=="+message);
}
//监听队列 bindings属性,交换机和对接进行绑定
@RabbitListener(bindings = {
@QueueBinding(value = @Queue,//临时队列
exchange = @Exchange(value = "directs",type = "direct"),//绑定交换机
key = {"info","error"})//绑定key,可以绑定多个key
})
public void receive6(String message){
System.out.println("message6=="+message);
}
测试结果
第五种模型:topic
和路由模式不用的是这种方法不用再写死Routing key,可以使用通配符的方式进行匹配
通配符有两种 * 和 # 两种用法如下:例如
user.* 可以匹配user.name user.sex user.key等
user.# 可以匹配user.name.sex.key
*只能代表一个单词,而#可以代表一个或者多个单词
生产者代码
/**
* @Description:测试topic模型RabbitMq
* @Author: ZhaoYaJun
* @Date: 2022/01/05
*/
@GetMapping(value = "/testRabbitMq")
//此注解为swagger注解,不用可以删掉
@ApiOperation(value = "测试RabbitMq",httpMethod = "GET",notes = "测试RabbitMq")
public void testRabbitMq(){
rabbitTemplate.convertAndSend("topics","user.info","topic模型");
}
消费者代码
//监听队列 bindings属性,交换机和对接进行绑定
@RabbitListener(bindings = {
@QueueBinding(value = @Queue,//临时队列
exchange = @Exchange(value = "topics",type = "topic"),//绑定交换机
key = {"user.info"})//绑定key,可以绑定多个key
})
public void receive7(String message){
System.out.println("message7=="+message);
}
//监听队列 bindings属性,交换机和对接进行绑定
@RabbitListener(bindings = {
@QueueBinding(value = @Queue,//临时队列
exchange = @Exchange(value = "topics",type = "topic"),//绑定交换机
key = {"user.*"})//绑定key,可以绑定多个key
})
public void receive8(String message){
System.out.println("message8=="+message);
}
测试结果
版权归原作者 后端三郎@ZYJ 所有, 如有侵权,请联系我们删除。