个人学习系列 - SpringBoot整合RabbitMQ

BitRanger
• 阅读 1883
研究一下消息队列,现在来简单搭建一下。

1. Docker搭建RabbitMQ

1.1 查询并下载RabbitMQ镜像

docker search rabbitmq

个人学习系列 - SpringBoot整合RabbitMQ

// 选择可以访问web管理界面的tag
docker pull rabbitmq:management

个人学习系列 - SpringBoot整合RabbitMQ

1.2 运行RabbitMQ镜像

// 设置账号密码都为admin
docker run -dit --name myrabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management

1.3 浏览器上访问 服务器IP:15672

出现以下页面表示启动成功
个人学习系列 - SpringBoot整合RabbitMQ

2. 搭建SpringBoot项目整合RabbitMQ

2.1 pom.xml

添加web和rabbitmq的依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit-test</artifactId>
    <scope>test</scope>
</dependency>

2.2 aplication.yml

将rabbitmq的地址用户名密码等配置上

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: admin
    password: admin

2.3 新建交换机SenderConfig.java

有以下三种常用的交换机,我们这里使用第三种

DirectExchange
直连型交换机,根据消息携带的路由键,将消息转发给对应的队列
FanoutExchange
扇形交换机,接收到消息后会将消息转发到所有队列
TopicExchange
主题交换机,根据消息携带的路由键和交换机与队列绑定键的规则,将消息转发给对应的队列
规则:
*(星号):表示一个字符必须出现
#(井号):表示任意数量的字符
/**
 * 交换机
 * @author zhouzhaodong
 */
@Configuration
public class SenderConfig {

    /**
     * ----- 交换机 -----
     * 参数意义:
     *   name: 名称
     *   durable: 持久化
     *   autoDelete: 自动删除
     */
    @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange("topicExchange", true, false);
    }

    /**
     * ----- 队列 -----
     */
    @Bean
    public Queue queueOne() {
        return new Queue("queueOne", true);
    }

    @Bean
    public Queue queueTwo() {
        return new Queue("queueTwo", true);
    }

    @Bean
    public Queue queueThree() {
        return new Queue("queueThree", true);
    }

    /**
     * ----- 绑定 -----
     * routingKey就是路由规则,消息对应的队列,用来区分不同的消息队列
     */
    @Bean
    public Binding bindingFanoutOne() {
        return BindingBuilder.bind(queueOne()).to(topicExchange()).with("topic_one");
    }

    @Bean
    public Binding bindingFanoutTwo() {
        return BindingBuilder.bind(queueTwo()).to(topicExchange()).with("topic_two");
    }

    @Bean
    public Binding bindingFanoutThree() {
        return BindingBuilder.bind(queueThree()).to(topicExchange()).with("topic_one");
    }

}

2.4 发送者 SenderController.java

/**
 * 消息发送者
 *
 * @author zhouzhaodong
 */
@RestController
public class SenderController {

    @Resource
    AmqpTemplate amqpTemplate;

    Logger logger = LoggerFactory.getLogger(SenderController.class);

    @RequestMapping(value = "/send")
    public String sendMessage(String message) {
        logger.info("消息发送开始时间:" + new Date());
        // 这里convertAndSend第一个参数是交换机的名称
        // 第二个参数可以是routingKey
        // 最后一个参数就是要发送的消息
        amqpTemplate.convertAndSend("topicExchange", "topic_one", message);
        return "发送成功";
    }

}

2.5 消费者 ReceiverController.java

/**
 * 消费者
 * @author zhouzhaodong
 */
@Component
public class ReceiverController {

    Logger logger = LoggerFactory.getLogger(ReceiverController.class);

    @RabbitHandler
    @RabbitListener(queues = "queueOne")
    public void processA(String message){
        logger.info("queueOne接收消息时间为:" + new Date());
        logger.info("queueOne接收消息为:" + message);
    }

    @RabbitHandler
    @RabbitListener(queues = "queueTwo")
    public void processB(String message){
        logger.info("queueTwo接收消息时间为:" + new Date());
        logger.info("queueTwo接收消息为:" + message);
    }

    @RabbitHandler
    @RabbitListener(queues = "queueThree")
    public void processC(String message){
        logger.info("queueThree接收消息时间为:" + new Date());
        logger.info("queueThree接收消息为:" + message);
    }

}

3. 启动项目进行测试

3.1 调用生产者接口

个人学习系列 - SpringBoot整合RabbitMQ
发现有两个队列收到了消息,因为这两个队列都配置的routingKey相同,都是topic_one
个人学习系列 - SpringBoot整合RabbitMQ

3.2 不带routingKey进行访问

个人学习系列 - SpringBoot整合RabbitMQ
发现并没有队列收到消息
个人学习系列 - SpringBoot整合RabbitMQ

测试结束

个人博客地址:

http://www.zhouzhaodong.xyz/

源代码地址:

https://gitee.com/zhouzhaodon...

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
RabbitMQ学习总结(7)——Spring整合RabbitMQ实例
1.RabbitMQ简介RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。 官网:http://www.rabbitmq.com/(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.rabbi
Wesley13 Wesley13
3年前
SQL利用函数或存储过程求男或女的总分平均分
!(https://oscimg.oschina.net/oscnet/633e11621f3e13e713cf063db00d72c8aa0.png)函数alterfunctionxb(@xingbievarchar(2))returnstableas
最新2021年Java大厂面试经验,赶紧学起来
内容简介:本书一共15章,核心内容为SpringBoot、SpringCloud、Docker、RabbitMQ消息组件。其中,SpringBoot是SpringMVC技术的延伸,使用它进行程序开发会更简单,服务整合也会更容易。SpringCloud是当前微架构的核心技术方案,属于SpringBoot的技术延伸,它可以整合云服务,基于RabbitMQ和G
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
RabbitMQ 消息中间件搭建详解
1.RabbitMQ简介消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(