快速尝鲜:SpringBoot 集成 RabbitMQ

2,270 阅读3分钟

「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」。

哈喽大家好,我是阿Q!

上文我们已经完成了RabbitMQ的安装,安完就要让它发挥点作用,今天就在SpringBoot项目里集成一下子,尝尝鲜!

在项目真正开始之前我们先来简单介绍下RabbitMQ的工作流程:

  • 生产者往交换机中发送消息;
  • 交换机通过规则绑定队列,通过路由键将消息存储到队列中;
  • 消费者获取队列中的消息进行消费;

环境:SpringBoot 2.6.3、JDK 1.8

项目搭建

首先创建SpringBoot项目 rabbit-mq

  1. 引入依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
  1. yml文件配置
spring:
  rabbitmq:
    host: 127.0.0.1     //rabbitMQ服务地址
    port: 15672   //这个地方暂时先用我们之前配置的15672
    username: cheetah   //自己的账户名
    password: 123456    //自己的密码
  1. 直连交换机

本项目以直连交换机为例,至于其他的交换机类型将在后文中给出详细介绍。

@Configuration
public class DirectRabbitConfig {

    /**
     * 定义交换机
     **/
    @Bean
    public DirectExchange directExchange(){
        /**
         * 交换机名称
         * 持久性标志:是否持久化,默认是 true 即声明一个持久的 exchange,该exchange将在服务器重启后继续运行
         * 自动删除标志:是否自动删除,默认为 false, 如果服务器想在 exchange不再使用时删除它,则设置为 true
         **/
        return new DirectExchange("directExchange"truefalse);
    }

    /**
     * 定义队列
     **/
    @Bean
    public Queue directQueue(){
        /**
         * name:队列名称
         * durable:是否持久化,默认是 true,持久化队列,会被存储在磁盘上,当消息代理重启时仍然存在
         * exclusive:是否排他,默认为 false,true则表示声明了一个排他队列(该队列将仅由声明者连接使用),如果连接关闭,则队列被删除。此参考优先级高于durable
         * autoDelete:是否自动删除, 默认是 false,true则表示当队列不再使用时,服务器删除该队列
         **/
        return new Queue("directQueue",true);
    }

    /**
     * 队列和交换机绑定
     * 设置路由键:directRouting
     **/
    @Bean
    Binding bindingDirect(){
        return BindingBuilder.bind(directQueue()).to(directExchange()).with("directRouting");
    }


}
  1. 消息发送
@RestController
public class SendMessageController {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @GetMapping("/sendMessage")
    public String sendMessage(){
        //将消息携带路由键值
        rabbitTemplate.convertAndSend("directExchange""directRouting""发送消息!");
        return "ok";
    }

}

我们先启动程序,在浏览器访问下

http://127.0.0.1:9001/sendMessage

报错如下:

我们之前已经给该用户分配过权限了,如果之前未分配,直接在客户端中配置:

之所以访问不到,是因为我们使用的端口号不正确

所以我们需要将端口改为 5672(如果是阿里云服务器实例,需要将该端口开放权限

我们再来访问下

http://127.0.0.1:9001/sendMessage

请求返回"OK",控制台输出

客户端相关页面截图如下:

  1. 消息消费
@Component
@RabbitListener(queues = "directQueue")//监听队列名称
public class MQReciever {

    @RabbitHandler
    public void process(String message){
        System.out.println("接收到的消息是:"+ message);
    }
}

启动项目,发现消息已经被消费。

为了防止消息丢失,RabbitMQ增加了消息确认机制,下文我们就来好好聊聊它的确认机制。

题外篇

阿Q将持续更新java实战方面的文章,感兴趣的可以关注下公众号:阿Q说代码,也可以来技术群讨论问题呦,点赞之交值得深交!