0


Springboot强势集成RabbitMQ

产自:后端三郎

时间:刚刚

参考: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不会创建队列,有了消费者监听才会创建队列)

25751f4084174a1598bac4a11e5a3028.png

第二种模型: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);
    }

测试结果

70d316d50e974823a2294bd82b8dfe43.png

第三种模型: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);
    }

测试结果

e18871ace2594908b2abfc200e2cbb7b.png

第四种模型: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);
    }

测试结果

c205222b059c4b7d9b14fed5c026e936.png

第五种模型: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);
    }

测试结果

dc867213f4b647999842d4977d98b34e.png


本文转载自: https://blog.csdn.net/ZhAoYaJ/article/details/125301294
版权归原作者 后端三郎@ZYJ 所有, 如有侵权,请联系我们删除。

“Springboot强势集成RabbitMQ”的评论:

还没有评论