【突破舒适圈】在SpringBoot中配置RabbitMq消息队列

业务背景

服务器的某个功能模块,在实际应用中会有多个用户同时访问,而每个用户需要进行的业务操作比较多,耗时较长。

若在第一个用户的操作没有完全做完时,第二个用户发起了请求,就有可能造成数据混乱的问题。

于是我们需要一个消息中间件来充当大门的作用,既要接待所有的“客人”(用户请求),又要保证每个“客人”的数据不错乱。
在这里插入图片描述

于是,RabbitMq凭借着自身功能强大,对待新手不友好…啊不对,是友好,友好…走入了我的视线。特此记录本次实践过程。

软件安装

这个东西之所以对新手很“友好”就是因为使用它的话,可不是仅仅导入几个依赖就能解决问题,还需要额外安装软件。减少大家走坑,资源链接两个软件地址

1.Erlang

首先安装这个软件,因为RabbitMq是基于这个东西开发出来的…
过程简单,一路下一步即可,安装完成后,配置环境变量,例如我的是这样。
在这里插入图片描述
然后打开控制台,输入erl,如果出现版本号,就代表安装完成。
在这里插入图片描述

2.RabbitMq

这里有大坑!!!
一定要注意版本对应!
一定要注意版本对应!
一定要注意版本对应!
比如官网的这张表,查询网址https://www.rabbitmq.com/which-erlang.html,不对应的话使用过程会无比艰巨,各种问题直接劝退。
在这里插入图片描述
安装过程同样简单,一路下一步。
安装完成后打开控制台(管理员模式!!!),进入sbin目录
输入rabbitmq-plugins.bat enable rabbitmq_management,代表开启服务组件
结果如图
在这里插入图片描述
接下来检查一下是否启动成功。输入rabbitmqctl status,结果会出来一些反馈,可能和我的不一样,不报错代表成功。
在这里插入图片描述
然后你就可以进入RabbitMq的图形化界面了。网址:http://127.0.0.1:15672/,不理解的可以去B站看看其他中间件的教学视频、原理就能理解了。
账号密码默认:guest,至于内部的操作以后在再学习。
在这里插入图片描述

3.启动RabbitMq服务

进入安装目录,双击启动。
在这里插入图片描述
短暂等待之后,启动成功不要把这个窗口关闭了!!
在这里插入图片描述

到这里,外部配置已经完成

项目配置

1.配依赖

pom文件中添加

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

2.配参数

我使用的是yml文件配置

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

所有配置全部结束!!!

代码使用举例

例如我们用一个名字为demoQueue的队列进行监听消息。

配置类

package com.carehome.app.config;

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {

    /**
     * 定义demoQueue队列
     * @return
     */
    @Bean
    public Queue demoString() {
        return new Queue("demoQueue");
    }

}

模拟用户类(即不断向服务器发请求的用户群体)

package com.carehome.app.controller;


import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

@Component
public class RabbitProducer {

    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void sendDemoQueue() {
        Date date = new Date();
        String dateString = "发送数据!!!";
        System.out.println("向[demoQueue] 发出消息: " + dateString);
        // 第一个参数为刚刚定义的队列名称
        this.rabbitTemplate.convertAndSend("demoQueue", dateString);
    }
}

模拟接收

package com.carehome.app.controller;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;


@Component
@RabbitListener(queues = "demoQueue")
public class DemoQueueConsumer {

    /**
     * 消息消费
     * @RabbitHandler 代表此方法为接受到消息后的处理方法
     */
    @RabbitHandler
    public void recieved(String msg) {
        System.out.println("[demoQueue] 接收到了: " + msg);
    }

}

最后我们通过一个控制器调用这些类,模拟业务场景。

模拟控制器类

package com.carehome.app.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class RabbitMqController {

    @Autowired
    private RabbitProducer rabbitProducer;

    @GetMapping("/sendDemoQueue")
    public Object sendDemoQueue() {
        rabbitProducer.sendDemoQueue();
        return "success";
    }
}

启动项目!!
http://localhost:8080/sendDemoQueue,访问两下!

在这里插入图片描述

成功!!!

总结

尽管开始因为自己不熟悉、以及网上某些狗P不同的假教学博客,踩了不少坑,但是经过不断地试错,终于配置完成,也算是收获了很多!!!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 添加rabbitmq依赖 在pom.xml添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 配置rabbitmq连接信息 在application.properties添加以下配置: ``` spring.rabbitmq.host=127.0.0.1 spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest ``` 3. 创建消息队列 在代码创建消息队列,可以使用@Bean注解进行创建: ``` @Bean public Queue delayQueue() { return new Queue("delay_queue"); } ``` 4. 创建交换机 创建交换机,可以使用@Bean注解进行创建: ``` @Bean public DirectExchange delayExchange() { return new DirectExchange("delay_exchange"); } ``` 5. 绑定队列和交换机 将队列和交换机进行绑定,可以使用@Bean注解进行创建: ``` @Bean public Binding delayBinding() { return BindingBuilder.bind(delayQueue()).to(delayExchange()).with("delay_key"); } ``` 6. 设置延时消息的TTL 设置延时消息的TTL,可以使用@Bean注解进行创建: ``` @Bean public CustomExchange customExchange() { Map<String, Object> args = new HashMap<>(); args.put("x-delayed-type", "direct"); return new CustomExchange("delayed_exchange", "x-delayed-message", true, false, args); } ``` 7. 发送延时消息 发送延时消息,可以使用rabbitTemplate发送消息: ``` rabbitTemplate.convertAndSend("delayed_exchange", "delay_key", message, message1 -> { message1.getMessageProperties().setHeader("x-delay", delayTime); return message1; }); ``` 其,delayTime为延时时间,单位为毫秒。 完整代码如下: ``` @Configuration public class RabbitmqConfig { @Autowired private RabbitTemplate rabbitTemplate; @Bean public Queue delayQueue() { return new Queue("delay_queue"); } @Bean public DirectExchange delayExchange() { return new DirectExchange("delay_exchange"); } @Bean public Binding delayBinding() { return BindingBuilder.bind(delayQueue()).to(delayExchange()).with("delay_key"); } @Bean public CustomExchange customExchange() { Map<String, Object> args = new HashMap<>(); args.put("x-delayed-type", "direct"); return new CustomExchange("delayed_exchange", "x-delayed-message", true, false, args); } public void sendDelayMessage(Object message, Integer delayTime) { rabbitTemplate.convertAndSend("delayed_exchange", "delay_key", message, message1 -> { message1.getMessageProperties().setHeader("x-delay", delayTime); return message1; }); } } ``` 调用sendDelayMessage方法即可发送延时消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AntyRia

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

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

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

打赏作者

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

抵扣说明:

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

余额充值