SpringBoot整合RabbitMQ,包含:初始化定义队列,消息发送,消息接收 --柚子真好吃

一、搭建RabbitMq服务并创建账号

服务采用Docker临时搭建,版本采用3.8,命令如下

  1. 拉取镜像

     docker pull rabbitmq:3.8.34-management
    
  2. 创建容器
    由于我使用的是 Docker Desktop 可通过可视化界面创建容器,将端口对应好即可,如下图:
    在这里插入图片描述

  3. 创建账号
    容器启动完毕后,访问本机 127.0.0.1:15672进入管理页面,输入初始化用户名密码 guest/guest

在这里插入图片描述
进入页面后选择,创建一个管理员账号,步骤如下图:
在这里插入图片描述

二、整合SpringBoot

  1. 首先引入依赖,版本可根据自身得springboot版本来确定

     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-amqp</artifactId>
         <version>2.5.4</version>
     </dependency>
    
  2. yml中添加配置项

     spring:
      rabbitmq:
     	 host: 127.0.0.1
      	 port: 5672
      	 virtual-host: /
       	 username: admin
     	 password: admin
    

三、服务初始化创建队列

通过集合配置实现自定交换机与队列的创建,具体代码如下:

@Slf4j
@Configuration
public class RabbitMqConfig {

    private List<RabbitMq> getConfig(){
        return Arrays.asList(
                RabbitMq.builder().type(ExchangeType.TOPIC).exchangeName("Topic.Student.Operate").queueName("Queue.student.Operate").key("student").build(),
                RabbitMq.builder().type(ExchangeType.FANOUT).exchangeName("Fanout.Notice.Operate").queueName("Queue.Notice.Operate.East").key("notice").build(),
                RabbitMq.builder().type(ExchangeType.FANOUT).exchangeName("Fanout.Notice.Operate").queueName("Queue.Notice.Operate.West").key("notice").build(),
                RabbitMq.builder().type(ExchangeType.FANOUT).exchangeName("Fanout.Notice.Operate").queueName("Queue.Notice.Operate.South").key("notice").build(),
                RabbitMq.builder().type(ExchangeType.FANOUT).exchangeName("Fanout.Notice.Operate").queueName("Queue.Notice.Operate.North").key("notice").build()
        );
    }

    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory factory){
        RabbitAdmin rabbitAdmin = new RabbitAdmin(factory);
        rabbitAdmin.setAutoStartup(true);
        for (RabbitMq mq : getConfig()){
            rabbitAdmin.declareExchange(getExchange(mq.getType(), mq.getExchangeName()));
            rabbitAdmin.declareQueue(new Queue(mq.getQueueName(),true,false,false));
            rabbitAdmin.declareBinding(new Binding(mq.getQueueName(),Binding.DestinationType.QUEUE, mq.getExchangeName(), mq.getKey(), null));
            log.info("【RabbitMQ】create new Queue '"+mq.getQueueName()+"' in '"+mq.getType()+"' Exchange '" +mq.getExchangeName()+"' with '"+mq.getKey()+"'");
        }
        return rabbitAdmin;
    }

    private Exchange getExchange(ExchangeType type,String name){
        switch (type){
            case TOPIC:
                return new TopicExchange(name);
            case FANOUT:
                return new FanoutExchange(name);
            case DIRECT:
                return new DirectExchange(name);
            default:
                throw new BusinessException("无效的交换机类型");
        }
    }

}

其中RabbitMq实体代码如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RabbitMq {
    private ExchangeType type;
    private String exchangeName;
    private String queueName;
    private String key;
}

配置完毕后启动服务,查看服务日志,如下所示:

2023-03-17 08:39:33.455  INFO 6612 --- [           main] com.ryan.project.config.RabbitMqConfig   : 【RabbitMQ】create new Queue 'Queue.student.Operate' in 'TOPIC' Exchange 'Topic.Student.Operate' with 'student'
2023-03-17 08:39:33.458  INFO 6612 --- [           main] com.ryan.project.config.RabbitMqConfig   : 【RabbitMQ】create new Queue 'Queue.Notice.Operate.East' in 'FANOUT' Exchange 'Fanout.Notice.Operate' with 'notice'
2023-03-17 08:39:33.460  INFO 6612 --- [           main] com.ryan.project.config.RabbitMqConfig   : 【RabbitMQ】create new Queue 'Queue.Notice.Operate.West' in 'FANOUT' Exchange 'Fanout.Notice.Operate' with 'notice'
2023-03-17 08:39:33.462  INFO 6612 --- [           main] com.ryan.project.config.RabbitMqConfig   : 【RabbitMQ】create new Queue 'Queue.Notice.Operate.South' in 'FANOUT' Exchange 'Fanout.Notice.Operate' with 'notice'
2023-03-17 08:39:33.465  INFO 6612 --- [           main] com.ryan.project.config.RabbitMqConfig   : 【RabbitMQ】create new Queue 'Queue.Notice.Operate.North' in 'FANOUT' Exchange 'Fanout.Notice.Operate' with 'notice'

此时交换机与队列均已创建完毕,可通过页面查看,如图所示:

在这里插入图片描述在这里插入图片描述

四、消息发送

创建完队列后即可发送消息,下面是2个案例,向不同交换机发送消息,代码如下:

  1. 定义发送消息接口

    public interface RabbitMqService {
    
        /**
         * 发送学生操作消息
         *
         * @param message 消息内容
         */
        public void sendStudentOperateMessage(String message);
    
        /**
         * 发送通知
         *
         * @param message 通知内容
         */
        public void sendNoticeMessage(String message);
    }
    
  2. 发送消息接口实现类

    @Slf4j
    @Service
    public class RabbitMqServiceImpl implements RabbitMqService {
    
        @Resource
        private RabbitTemplate rabbitTemplate;
    
        @Override
        public void sendStudentOperateMessage(String message) {
            String exchange = "Topic.Student.Operate";
            rabbitTemplate.convertAndSend(exchange, "student", message);
            log.info("【RabbitMQ】Send message to '" + exchange + "' with '" + message + "'");
        }
    
        @Override
        public void sendNoticeMessage(String message) {
            String exchange = "Fanout.Notice.Operate";
            rabbitTemplate.convertAndSend(exchange, "notice", message);
            log.info("【RabbitMQ】Send message to '" + exchange + "' with '" + message + "'");
        }
    }
    
  3. 编写测试Controller

    @RestController
    public class RabbitMqController {
    
        @Resource
        private RabbitMqService rabbitMqService;
    
        @GetMapping("/student")
        public String student() {
            String message = "张剑注销了自己的饭卡";
            rabbitMqService.sendStudentOperateMessage(message);
            return message;
        }
    
        @GetMapping("/notice")
        public String notice() {
            String message = "【通知】四个校区今年全体放假364天";
            rabbitMqService.sendNoticeMessage(message);
            return message;
        }
    
    }
    
  4. 访问接口

    在这里插入图片描述
    在这里插入图片描述

     2023-03-17 08:55:09.955  INFO 2348 --- [nio-8888-exec-1] c.r.project.service.RabbitMqServiceImpl  : 【RabbitMQ】Send message to 'Fanout.Notice.Operate' with '【通知】四个校区今年全体放假364天'
     2023-03-17 08:56:00.953  INFO 2348 --- [nio-8888-exec-5] c.r.project.service.RabbitMqServiceImpl  : 【RabbitMQ】Send message to 'Topic.Student.Operate' with '张剑注销了自己的饭卡'
    
  5. 查看消息

    在这里插入图片描述

    发现已经存在消息,当然也可以进入具体队列,查看对应消息,如下:

    在这里插入图片描述

五、接收消息

接收消息是针对每个具体的队列,实现代码如下:

@Slf4j
@Component
public class RabbitMqReceive {

    @RabbitListener(queues = "Queue.student.Operate")
    public void opera(String context) {
        log.info("【学生操作】" + context);
    }

    @RabbitListener(queues = "Queue.Notice.Operate.East")
    public void east(String context) {
        log.info("【东部学院】" + context);
    }

    @RabbitListener(queues = "Queue.Notice.Operate.West")
    public void west(String context) {
        log.info("【西部学院】" + context);
    }

    @RabbitListener(queues = "Queue.Notice.Operate.South")
    public void south(String context) {
        log.info("【南部学院】" + context);
    }

    @RabbitListener(queues = "Queue.Notice.Operate.North")
    public void north(String context) {
        log.info("【北部学院】" + context);
    }

}

服务启动查看控制台打印信息:

2023-03-17 09:02:03.985  INFO 3688 --- [ntContainer#0-1] c.ryan.project.service.RabbitMqReceive   : 【学生操作】张剑注销了自己的饭卡
2023-03-17 09:02:03.985  INFO 3688 --- [ntContainer#1-1] c.ryan.project.service.RabbitMqReceive   : 【南部学院】【通知】四个校区今年全体放假364天
2023-03-17 09:02:03.988  INFO 3688 --- [ntContainer#2-1] c.ryan.project.service.RabbitMqReceive   : 【东部学院】【通知】四个校区今年全体放假364天
2023-03-17 09:02:03.991  INFO 3688 --- [ntContainer#3-1] c.ryan.project.service.RabbitMqReceive   : 【西部学院】【通知】四个校区今年全体放假364天
2023-03-17 09:02:03.995  INFO 3688 --- [ntContainer#4-1] c.ryan.project.service.RabbitMqReceive   : 【北部学院】【通知】四个校区今年全体放假364天

此时查看可视化页面,发现消息数均为0,说明消息均被消费

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot 是一个方便快捷的轻量级框架,提供了许多便利的功能和特性,其中就包括了 RabbitMQ整合功能。 RabbitMQ 是一个广泛使用的消息队列系统,具有高可靠性和可扩展性,能够在分布式系统中实现异步通信、解耦和任务调度等功能,因此对于分布式系统而言具备非常重要的价值。 在Spring Boot中,整合RabbitMQ 可以通过以下步骤完成: 1. 添加 RabbitMQ 的相关依赖:在 pom.xml 文件中添加 spring-boot-starter-amqp 依赖。 2. 配置 RabbitMQ 相关信息:通过 application.yml 或 application.properties 配置文件配置RabbitMQ 的基本信息,例如:连接地址、用户名、密码等。 3. 创建 RabbitMQ 模板:通过 RabbitTemplate 类提供的方法向 RabbitMQ 发送消息接收响应信息。 4. 创建 Exchange 和 Queue:在 RabbitMQ 中创建 Exchange 和 Queue,Exchange 用于将消息路由到指定的 Queue 中。 5. 编写发送消息的代码:通过 RabbitTemplate 提供的方法send()发送消息,可以是简单字符串/对象/json等。 至此,我们已经实现了一个简单的 RabbitMQ 消息发送程序。但是在实际应用场景中,还需要具备更进一步完善的功能,例如:消息确认、消息持久化、消费者监听等功能,这些可以通过配置listener容器、消息确认机制以及使用DurableQueue,DurableExchange等参数来实现。 总之,RabbitMQ’s and Spring Boot的集成非常方便和快捷。通过简单的配置和实现,我们就可以使用 RabbitMQ 在分布式系统中实现异步通信、解决问题、任务调度等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我是小金毛

可怜可怜孩子吧

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

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

打赏作者

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

抵扣说明:

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

余额充值