手把手学习RabbitMQ消息队列(Demo详解)

【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!

博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

吾等采石之人,应怀大教堂之心,愿你们奔赴在各自的热爱中…


一、文章序言

面试中常会问到为什么使用消息队列

面试官更期望的回答是你项目的真实应用场景,使用MQ解决了什么问题,带来什么好处,如果不用有什么弊端等。

在这里插入图片描述

消息队列最核心的三个点:解耦、异步、削峰。

参考文章:消息队列作用(解耦、异步、削峰)图详解

消息队列也设计到生产者,消费者原理可以简单的了解一下

参考文章:生产者消费者问题-代码详解(Java多线程)


二、代码分析

rabbitmq如何使用呢

首先创建一个配置类,创建一些队列,并且赋予队列名称

@Configuration
public class RabbitMqConfig {

   @Bean
    public Queue queue1(){
        return new Queue("test1");
    }
   @Bean
    public Queue queue2(){
        return new Queue("test2");
    }

    @Bean
    public Queue queue3(){
       return new Queue("test3");
    }
}

在controller层创建一个amqpTemplate对象,这个对象就可以传递相关信息,它可以将信息发送给相关的队列

进而有监听该队列的消费者就可以消费发送的信息

@RestController
public class SendDemoController {
    @Autowired
    private AmqpTemplate amqpTemplate;
    
    @RequestMapping("/multiSend")
    public String multiSend(){
        StringBuilder times=new StringBuilder();
        for(int i=0;i<10;i++){
            long time=System.nanoTime();
            amqpTemplate.convertAndSend("test1","第"+i+"次发送的时间:"+time);
            times.append(time+"<br>");
        }
        return times.toString();
    }

    @RequestMapping("/multi2MultiSend")
    public String mutil2MutilSend(){
        StringBuilder times=new StringBuilder();
        for(int i=0;i<10;i++){
            long time=System.nanoTime();
            amqpTemplate.convertAndSend("test1","第"+i+"次发送的时间:"+time);
            amqpTemplate.convertAndSend("test2","第"+i+"次发送的时间:"+time);
            times.append(time+"<br>");
        }
        return times.toString();
    }
   //测试发送string类型的消息
    @RequestMapping("/sendTest3")
    public void sendTestString(){
        StringBuilder a = new StringBuilder();
        for (int i=0;i<10;i++){
            String uuid = UUID.randomUUID().toString();
            amqpTemplate.convertAndSend("test3","第"+i+"次发送的时间:"+uuid);
            a.append(uuid+"<br>");
        }
    }

  //测试发送int类型的消息
    @RequestMapping("/sendTest33")
    public void sendTestInteger(){
        StringBuilder a = new StringBuilder();
        for (int i=0;i<10;i++){
            amqpTemplate.convertAndSend("test3",1);
        }
    }

}

消费者1 监听队列test1 消费后输出在控制台

@RabbitListener 可以标注在类上面,需配合 @RabbitHandler 注解一起使用
@RabbitListener 标注在类上面表示当有收到消息的时候,就交给 @RabbitHandler 的方法处理,

@Component
@RabbitListener(queues = "test1")
public class Receiver1 {

    @RabbitHandler
    public void  recevier(String msg){
        System.out.println("Test1 receiver1:"+msg);
    }

}

首先测试我们的第一个访问路径

在这里插入图片描述
控制台的输出如下

Test1 receiver1:0次发送的时间:88337654992000
Test1 receiver1:1次发送的时间:88337661695100
Test1 receiver1:2次发送的时间:88337663620800
Test1 receiver1:3次发送的时间:88337664685500
Test1 receiver1:4次发送的时间:88337671656700
Test1 receiver1:5次发送的时间:88337673557700
Test1 receiver1:6次发送的时间:88337675688700
Test1 receiver1:7次发送的时间:88337676873100
Test1 receiver1:8次发送的时间:88337679355700
Test1 receiver1:9次发送的时间:88337681630300

消费者2 监听

@Component
@RabbitListener(queues = "test2")
public class Receiver2 {

    @RabbitHandler
    public void receiver(String msg){
        System.out.println("Test2 receiver2:"+msg);
    }
}

测试访问第二个路径,同时给队列test1和test2发送信息
在这里插入图片描述
控制台消费者1和消费者2输出 代表消费者成功消费
在这里插入图片描述

如果在一个监听队列中给不同的方法重载,如下即可以消费string类型的,也可以消费Integer 类型的

此时队列进行监听 不同类型的消息可以自己识别 —>进而不同的输出语句

具体使用哪个方法处理,根据 MessageConverter 转换后的参数类型

@Component
@RabbitListener(queues="test3")
public class Receiver3 {

    @RabbitHandler
    public void receiver3(String msg){
        System.out.println("消费者3接受的消息是"+msg);
    }

    @RabbitHandler
    public void receiver3(Integer msg){
        System.out.println(msg);
    }
}

测试访问第三个路径,给队列test3发送信息 观察到controller层该信息给String类型

在这里插入图片描述
测试访问第四个路径,给队列test3发送信息 观察到controller层该信息给Integer类型
在这里插入图片描述
控制台的输出如下 可以看到依次消费出string类型 和 integer类型的相关信息

在这里插入图片描述
项目配置文件:如上代码建议初学者自己实践一遍

server.port=8099
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

相信你一定看懂了整个项目的基本运行流程,本篇仅仅是一个基础应用实践案例,其实rabbitmq还有很多细节和基础值得我们深度学习 ,下期见!


The best investment is to invest in yourself.

在这里插入图片描述

2020.09.12 秋天是个收获的季节,我们更高处见!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员可乐丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值