SpringBoot2.7.4整合RabbitMq

目录

1.打开pom.xml文件,添加依赖

2.更改resources配置文件名称为application.yml,增加配置参数

3.启动类SpringbootStudyApplication

4.在study下面新建各种包名,编写相应的代码(以下是常见模式)

[①.直连交换机模式(Direct Exchange)](#①.直连交换机模式(Direct Exchange))

②.广播模式(Fanout)

③.通配符模式(Topic)

5.使用postman访问

6.查看开发工具控制台日志

①.直连交互机模式

②.广播模式

③.通配符模式

7.下载地址

①.直连交互机模式

②.广播模式

③.通配符模式


1.打开pom.xml文件,添加依赖

XML 复制代码
<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>

        <!--rabbitmq依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

2.更改resources配置文件名称为application.yml,增加配置参数

XML 复制代码
server:
  port: 8888 #指定启动的端口
spring:
  rabbitmq:
    host: localhost      # rabbitmq服务地址
    port: 5672           # 端口号
    username: guest      # 用户名
    password: guest      # 密码
    virtual-host: /      # 虚拟主机

3.启动类SpringbootStudyApplication

java 复制代码
package com.saas.study;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootStudyApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootStudyApplication.class, args);
    }

}

4.在study下面新建各种包名,编写相应的代码(以下是常见模式)

①.直连交换机模式(Direct Exchange)
复制代码
component层
java 复制代码
package com.saas.study.component;

import com.saas.study.config.RabbitMqConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * rabbitmq生产者
 */
@Component
public class RabbitMqProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    //发送消息方法
    public void sendMessage(String message) {
        rabbitTemplate.convertAndSend(
                RabbitMqConfig.TEST_EXCHANGE,
                RabbitMqConfig.TEST_ROUTING_KEY,
                message
        );
        System.out.println("生产者发送消息:" + message);
    }
}
java 复制代码
package com.saas.study.component;

import com.saas.study.config.RabbitMqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * rabbitmq消费者
 */
@Component
public class RabbitMqConsumer {

    //监听指定队列
    @RabbitListener(queues = RabbitMqConfig.TEST_QUEUE)
    public void receiveMessage(String message) {
        System.out.println("消费者接收消息:" + message);
    }
}

config层

java 复制代码
package com.saas.study.config;

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;

/**
 * rabbitmq配置类
 */
@Configuration
public class RabbitMqConfig {

    //队列名称
    public static final String TEST_QUEUE = "test_queue";
    //交换机名称
    public static final String TEST_EXCHANGE = "test_exchange";
    //路由键
    public static final String TEST_ROUTING_KEY = "test_routing_key";

    //声明队列
    @Bean
    public Queue testQueue() {
        //durable: 是否持久化,exclusive: 是否排他,autoDelete: 是否自动删除
        return new Queue(TEST_QUEUE, true, false, false);
    }

    //声明直连交换机
    @Bean
    public DirectExchange testExchange() {
        return new DirectExchange(TEST_EXCHANGE, true, false);
    }

    //绑定队列到交换机,并指定路由键
    @Bean
    public Binding bindingTestQueue(Queue testQueue, DirectExchange testExchange) {
        return BindingBuilder.bind(testQueue).to(testExchange).with(TEST_ROUTING_KEY);
    }
}

controller层

java 复制代码
package com.saas.study.controller;

import com.saas.study.component.RabbitMqProducer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * 访问rabbitmq控制类
 */
@RestController
public class RabbitMqController {

    @Resource
    private RabbitMqProducer rabbitMqProducer;

    @GetMapping("/testSendMessage")
    public void testSendMessage() {
        rabbitMqProducer.sendMessage("hello rabbitmq");
    }
}
②.广播模式(Fanout)

component层

java 复制代码
package com.saas.study.component;

import com.saas.study.config.FanoutRabbitMqConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * rabbitmq生产者
 */
@Component
public class RabbitMqProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    //发送消息方法
    public void sendMessage(String message) {
        rabbitTemplate.convertAndSend(
                FanoutRabbitMqConfig.FANOUT_EXCHANGE,
                "", // 无需路由键
                message
        );
        System.out.println("广播生产者发送消息:" + message);
    }
}
java 复制代码
package com.saas.study.component;

import com.saas.study.config.FanoutRabbitMqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * rabbitmq消费者一
 */
@Component
public class RabbitMqConsumerOne {

    //监听指定队列
    @RabbitListener(queues = FanoutRabbitMqConfig.FANOUT_QUEUE_ONE)
    public void receiveMessage(String message) {
        System.out.println("消费者接收队列一消息:" + message);
    }
}
java 复制代码
package com.saas.study.component;

import com.saas.study.config.FanoutRabbitMqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * rabbitmq消费者二
 */
@Component
public class RabbitMqConsumerTwo {

    //监听指定队列
    @RabbitListener(queues = FanoutRabbitMqConfig.FANOUT_QUEUE_TWO)
    public void receiveMessage(String message) {
        System.out.println("消费者接收队列二消息:" + message);
    }
}

config层

java 复制代码
package com.saas.study.config;

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

/**
 * rabbitmq广播模式配置类
 */
@Configuration
public class FanoutRabbitMqConfig {
    //交换机名称
    public static final String FANOUT_EXCHANGE = "fanout_exchange";

    //队列一名称
    public static final String FANOUT_QUEUE_ONE = "fanout_queue_one";
    //队列二名称
    public static final String FANOUT_QUEUE_TWO = "fanout_queue_two";

    //声明交换机
    @Bean
    public FanoutExchange fanoutExchange() {
        // durable: 持久化,autoDelete: 不自动删除
        return new FanoutExchange(FANOUT_EXCHANGE, true, false);
    }

    //声明队列一
    @Bean
    public Queue fanoutQueueOne() {
        return new Queue(FANOUT_QUEUE_ONE, true, false, false);
    }

    //声明队列二
    @Bean
    public Queue fanoutQueueTwo() {
        return new Queue(FANOUT_QUEUE_TWO, true, false, false);
    }

    //将队列定一绑定到交换机,这里无需要路由键
    @Bean
    public Binding bindingQueueOne(Queue fanoutQueueOne, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(fanoutQueueOne).to(fanoutExchange);
    }

    //将队列定二绑定到交换机,这里无需要路由键
    @Bean
    public Binding bindingQueueTwo(Queue fanoutQueueTwo, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(fanoutQueueTwo).to(fanoutExchange);
    }
}

controller层

java 复制代码
package com.saas.study.controller;

import com.saas.study.component.RabbitMqProducer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * 访问rabbitmq控制类
 */
@RestController
public class RabbitMqController {

    @Resource
    private RabbitMqProducer rabbitMqProducer;

    @GetMapping("/testSendMessage")
    public void testSendMessage() {
        rabbitMqProducer.sendMessage("hello rabbitmq");
    }
}
③.通配符模式(Topic)

component层

java 复制代码
package com.saas.study.component;

import com.saas.study.config.TopicRabbitMqConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * rabbitmq生产者
 */
@Component
public class RabbitMqProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    //发送消息方法
    public void sendMessage(String routingKey, String message) {
        rabbitTemplate.convertAndSend(
                TopicRabbitMqConfig.TOPIC_EXCHANGE,
                routingKey,
                message
        );
        System.out.println("生产者发送消息,路由键:"+routingKey+",消息:"+message);
    }
}
java 复制代码
package com.saas.study.component;

import com.saas.study.config.TopicRabbitMqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * rabbitmq消费者一
 */
@Component
public class RabbitMqConsumerOne {

    //监听指定队列,匹配user.*
    @RabbitListener(queues = TopicRabbitMqConfig.TOPIC_QUEUE_ONE)
    public void receiveMessage(String message) {
        System.out.println("消费者接收队列一消息:" + message);
    }
}
java 复制代码
package com.saas.study.component;

import com.saas.study.config.TopicRabbitMqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * rabbitmq消费者二
 */
@Component
public class RabbitMqConsumerTwo {

    //监听指定队列,匹配*.order
    @RabbitListener(queues = TopicRabbitMqConfig.TOPIC_QUEUE_TWO)
    public void receiveMessage(String message) {
        System.out.println("消费者接收队列二消息:" + message);
    }
}
java 复制代码
package com.saas.study.component;

import com.saas.study.config.TopicRabbitMqConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * rabbitmq消费者三
 */
@Component
public class RabbitMqConsumerThree {

    //监听指定队列,匹配#.stock
    @RabbitListener(queues = TopicRabbitMqConfig.TOPIC_QUEUE_THREE)
    public void receiveMessage(String message) {
        System.out.println("消费者接收队列三消息:" + message);
    }
}

config层

java 复制代码
package com.saas.study.config;

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

/**
 * rabbitmq通配符模式配置类
 */
@Configuration
public class TopicRabbitMqConfig {
    //交换机名称
    public static final String TOPIC_EXCHANGE = "topic_exchange";

    //队列一名称
    public static final String TOPIC_QUEUE_ONE = "topic_queue_one";
    //队列二名称
    public static final String TOPIC_QUEUE_TWO = "topic_queue_two";
    //队列三名称
    public static final String TOPIC_QUEUE_THREE = "topic_queue_three";

    //声明交换机
    @Bean
    public TopicExchange topicExchange() {
        // durable: 持久化,autoDelete: 不自动删除
        return new TopicExchange(TOPIC_EXCHANGE, true, false);
    }

    //声明队列一
    @Bean
    public Queue topicQueueOne() {
        return new Queue(TOPIC_QUEUE_ONE, true, false, false);
    }

    //声明队列二
    @Bean
    public Queue topicQueueTwo() {
        return new Queue(TOPIC_QUEUE_TWO, true, false, false);
    }

    //声明队列三
    @Bean
    public Queue topicQueueThree() {
        return new Queue(TOPIC_QUEUE_THREE, true, false, false);
    }

    //将队列定一绑定到交换机
    @Bean
    public Binding bindingQueueOne(Queue topicQueueOne, TopicExchange topicExchange) {
        return BindingBuilder.bind(topicQueueOne).to(topicExchange).with("user.*"); //匹配user.xxx;
    }

    //将队列定二绑定到交换机
    @Bean
    public Binding bindingQueueTwo(Queue topicQueueTwo, TopicExchange topicExchange) {
        return BindingBuilder.bind(topicQueueTwo).to(topicExchange).with("*.order"); //匹配xxx.order
    }

    //将队列定三绑定到交换机
    @Bean
    public Binding bindingQueueThree(Queue topicQueueThree, TopicExchange topicExchange) {
        return BindingBuilder.bind(topicQueueThree).to(topicExchange).with("#.stock"); //匹配xxx.stock或xxx.xxx.stock等
    }
}

controller层

java 复制代码
package com.saas.study.controller;

import com.saas.study.component.RabbitMqProducer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * 访问rabbitmq控制类
 */
@RestController
public class RabbitMqController {

    @Resource
    private RabbitMqProducer rabbitMqProducer;

    @GetMapping("/testSendMessage")
    public void testSendMessage() {
        //路由键=user.info → 匹配 user.*
        rabbitMqProducer.sendMessage("user.info", "用户注册通知");
        //路由键=create.order → 匹配 *.order
        rabbitMqProducer.sendMessage("create.order", "订单创建成功");
        //路由键=admin.add.stock → 匹配 #.stock
        rabbitMqProducer.sendMessage("admin.add.stock", "管理增加库存通知");
        //路由键=stock → 匹配 #.stock
        rabbitMqProducer.sendMessage("stock", "库存通知");
    }
}

5.使用postman访问

6.查看开发工具控制台日志

①.直连交互机模式
②.广播模式
③.通配符模式

7.下载地址

①.直连交互机模式

百度云: https://pan.baidu.com/s/1_aJ07Bp5JDE23gwdxmpzjw 提取码: 3tst

②.广播模式

百度云: https://pan.baidu.com/s/1R1LxE4w_NDigCf2dwzODYw 提取码: xv5e

③.通配符模式

百度云: https://pan.baidu.com/s/1WvZ6CL96MIcAOwJmsr4uGg 提取码: e4zx

相关推荐
镜水灵动19 小时前
redisTemplate执行lua脚本报错‘for‘ initial value must be a number
lua·springboot
武子康20 小时前
Java-195 RabbitMQ BlockingQueue 手搓“消息中间件”雏形:生产者-消费者模型到企业级 MQ 差在哪
java·分布式·架构·消息队列·rabbitmq·java-rabbitmq·mq
武子康1 天前
Java-196 消息队列选型:RabbitMQ vs RocketMQ vs Kafka
java·分布式·kafka·rabbitmq·rocketmq·java-rocketmq·java-rabbitmq
南知意-1 天前
开源高性能IM+集成AI能力,基于SpringBoot +Tauri+Vue 3+TypeScript支持全平台与丰富会话模式
typescript·开源·springboot·tauri·工具·im·软件
Wang's Blog1 天前
RabbitMQ: 高并发外卖系统的微服务架构设计与工程实现
分布式·微服务·rabbitmq
Wang's Blog2 天前
RabbitMQ: 消息交换机制的核心原理与实践指南之基于 AMQP 协议的系统设计与工程实现
分布式·rabbitmq
深蓝电商API2 天前
爬虫+消息队列:RabbitMQ vs Kafka vs RocketMQ选型
爬虫·kafka·rabbitmq
Wang's Blog2 天前
RabbitMQ: 消息中间件技术选型
分布式·rabbitmq
、我是男生。3 天前
钨粉与小烛树蜡的熔融实验
rabbitmq
她说..3 天前
Spring AOP场景3——接口防抖(附带源码)
java·后端·spring·java-ee·springboot