【消息队列RabbitMQ】JDK21的SpringBoot集成RabbitMQ入门版

本文详细介绍了如何在SpringBoot项目中集成RabbitMQ,包括使用Direct路由模式创建生产者和消费者,自定义Exchange和Queue,以及配置连接信息。通过最小步骤展示了消息的发送和接收过程。
摘要由CSDN通过智能技术生成


前言

本文将介绍JDK21的SpringBoot集成RabbitMQ的 最小可行的最精简步骤,并使用Direct路由模式演示生产者和消费者之间的消息传递。

一、RabbitMQ是什么?

RabbitMQ是一个开源的消息代理和队列服务器,用于通过轻量级和可靠的消息传递,在服务器之间进行通信。

RabbitMQ主要支持以下几种模式:

  1. 简单模式(Simple):这是最简单的模式,一个生产者发送消息到一个队列,一个消费者从队列中接收消息。这种模式是一对一的关系。
  2. 工作队列模式(Work Queue):一个生产者发送消息到队列,多个消费者从队列中接收消息。这种模式是一对多的关系,主要用于处理大量并发任务,提高系统处理能力。
  3. 发布/订阅模式(Publish/Subscribe):也称为扇形(fanout)交换模式。一个生产者发送消息到交换机,交换机将消息发送到所有与之绑定的队列,每个队列中的消息都会被其对应的消费者接收。这种模式实现了消息的广播。
  4. 路由模式(Direct-Routing):一个生产者发送带有路由键的消息到交换机,交换机根据路由键将消息发送到对应的队列,消费者从队列中接收消息。这种模式可以根据路由键实现消息的定向发送。
  5. 主题模式(Topics):一种更灵活的路由模式。生产者发送带有路由键的消息到交换机,交换机根据路由键的模式匹配规则将消息发送到对应的队列。这种模式可以实现更复杂的消息路由需求。
  6. RPC模式:即远程过程调用,客户端发送请求消息到队列,服务器监听队列并接收请求消息,处理完成后将结果消息发送到另一个队列,客户端从结果队列中接收结果消息。这种模式实现了跨服务器的方法调用。
  7. header模式:较少使用

二、使用步骤

1.实现要素

  • 正在运行的RabbitMQ

可使用docker快速安装部署

  • 消费者微服务

用于配置Exchange和Queue的绑定关系
PS:有了此配置后,当消费者微服务启动时,会 自动 在rabbitmq中创建对应的exchange交换机和queue队列,就不会因为没有提前创建好exchange和queue而使系统启动不了。(也可在生产端其他公共服务rabbitmq的管理后台 配置)

用于监听Queue是否有新的消息,以便实时消费

  • 生产者微服务

用于发送消息到消息队列

2.创建SpringBoot项目

2-1 项目结构

MQ_RABBIT_TEST1 内部包含两个子模块,分别是:
RABBIT_CONSUMER(消费端)
RABBIT_PRODUCER(生产端)
在这里插入图片描述

2-2 RABBIT_CONSUMER(消费端)的实现:

2-2-1 pom.xml中引入关键包

spring-boot-starter-amqp用于springboot与rabbitmq集成(必须)

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
</dependencies>
2-2-2 编写消息队列的配置,自动创建Exchange和Queue

使用@Configuration的纯java方式

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


@Configuration
public class QueueConfig {
    private final String EXCHANGE_NAME = "direct_exchange";
    private final String ROUTING_KEY = "direct_queue_key";
    private final String QUEUE_NAME = "direct_queue";

    @Bean
    public Queue queue() {
        /*
        name (QUEUE_NAME):
        这个字符串参数指定了队列的名称
        
        durable (true):
        如果设置为true,表示创建的是持久化的队列。
        如果设置为false,非持久化队列在消息代理重启后将会消失,其中的消息也会丢失。
        
        exclusive (false):
        当设置为true时,队列将是排他的,即只允许一个消费者连接并消耗队列中的消息。
        对于本例中设置为false的情况,这意味着多个消费者可以同时订阅并从队列中接收消息,遵循先入先出(FIFO)的原则。
        
        autoDelete (false):
        若设为true,当所有消费者断开与队列的连接,并且不再有新的消费者订阅该队列时,消息代理会自动删除这个队列。
        而在本例中由于设置为false,即使没有消费者连接,队列也不会自动删除,除非显式地由应用程序或管理员手动删除。*/
        return new Queue(QUEUE_NAME, true, false, false);
    }

    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange(EXCHANGE_NAME, true, false);
    }

    @Bean
    public Binding binding(Queue queue, DirectExchange exchange) {
        /*将exchange和queue绑定,并且指定了routingKey为:direct_queue_key*/
        return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
    }
}

2-2-3 编写队列监听器,实时监听是否有新消息
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class DirectQueueListener {
    @RabbitListener(queues = "direct_queue")
    public void receive(String message) {
        System.err.println("direct_queue接收到消息:" + message);
    }
}

2-2-4 配置RabbitMQ的连接信息

注意:RabbitMQ存在两个端口,分别是15672和5672。
15672是浏览器登录管理后台的端口,5672才是要配置到yml文件中的端口。
如果是使用Docker部署的RabbitMQ(比如:docker run -p 5673:5672 …),则此时应该配置5673这个宿主机的端口,docker才能通过5673映射到5672

server:
  port: 8080
spring:
  rabbitmq:
    host: localhost
    port: 5673
    username: guest
    password: guest
    virtual-host: /

消费端的构建要素都已经实现完毕,可正常启动,并到RabbitMQ管理平台查看是否正常创建exchange和queue。
在这里插入图片描述在这里插入图片描述

2-3 RABBIT_PRODUCER(生产端)的实现

2-3-1 pom.xml中引入关键包

spring-boot-starter-amqp用于springboot与rabbitmq集成(必须)
spring-boot-starter-web用于编写controller供外部调用(可不用)

<dependencies>
        <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>
</dependencies>
2-3-2 配置RabbitMQ的连接信息
server:
  port: 8081
spring:
  rabbitmq:
    host: localhost
    port: 5673
    username: guest
    password: guest
    virtual-host: /
2-3-3 使用RabbitTemplate发送消息
import jakarta.annotation.Resource;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MessageController {
    @Resource
    private RabbitTemplate rabbitTemplate;
    @GetMapping("/send")
    public void send(){
        rabbitTemplate.convertAndSend("direct_exchange","direct_queue_key","hello rabbitmq");
    }
}

生产端的构建要素也配置完毕。

3.启动生产和消费两个微服务,实现消息发送

效果如下:
进入8081生产端的controller运行界面,点击运行
8080消费端顺利拿到消息进行处理。
在这里插入图片描述


总结

以上就是今天要讲的内容,本文主要介绍了SpringBoot和RabbitMQ集成的最小步骤,演示了RabbitMQ的Direct路由模式。其他模式与其类似,就不一一演示,仅此记录并分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值