一文看懂Spring Boot整合Rabbit MQ实现多种模式的生产和消费

简介: 一文看懂Spring Boot整合Rabbit MQ实现多种模式的生产和消费

1 RabbitMQ介绍

1.1 各个组件的层级关系

1.2 RabbitMQ的六种模式

2 Spring Boot整合RabbitMQ

2.1 RabbitMQ配置
2.1.1 添加用户

2.1.2 添加虚拟机

2.1.3 分配权限

2.1.4 添加队列

2.2 Spring Boot工程搭建
2.2.1 依赖
<!--   spring boot-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<!--  rabbitmq  amqp -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!--   web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--    test-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
2.2.2 配置文件
spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: test
    password: 123
    virtual-host: /test
2.3 各个模式测试
2.3.1 HelloWorld

生产者:

@Component
public class Test01 {
    /**
     * 注入rabbitTemplate
     */
    @Autowired
    private RabbitTemplate rabbitTemplate;
    /**
     * Hello world
     */
    public void testHello() {
        /**
         * 参数1: 消息队列的名字
         * 参数2: 发送的消息
         */
        rabbitTemplate.convertAndSend("sp_test", "hello world");
    }
}

消费者:

@Component
public class Consumer {
    /**
     * 一个消费者
     *
     * @param message
     */
    @RabbitListener(queuesToDeclare = @Queue("sp_test"))
    public void receive1(String message) {
        System.out.println("message1 = " + message);
    }
}

测试:

@SpringBootTest
class SpRabbitmqApplicationTests {
    @Autowired
    private Test01 test01;
    @Test
    void producerTest01() {
        test01.testHello();
    }
}

2.3.2 Work Queues

生产者:

@Component
public class Test01 {
    /**
     * 注入rabbitTemplate
     */
    @Autowired
    private RabbitTemplate rabbitTemplate;
    /**
     * Work
     */
    public void testWork() {
        for (int i = 0; i < 10; i++) {
            rabbitTemplate.convertAndSend("sp_test", "work模型" + i);
        }
    }
}

消费者:

@Component
public class Consumer {
    /**
     * 一个消费者
     *
     * @param message
     */
    @RabbitListener(queuesToDeclare = @Queue("sp_test"))
    public void receive1(String message) {
        System.out.println("message1 = " + message);
    }
    /**
     * 一个消费者
     *
     * @param message
     */
    @RabbitListener(queuesToDeclare = @Queue("sp_test"))
    public void receive2(String message) {
        System.out.println("message2 = " + message);
    }
}

测试:

@Component
public class Consumer {
    /**
     * 一个消费者
     *
     * @param message
     */
    @RabbitListener(queuesToDeclare = @Queue("sp_test"))
    public void receive1(String message) {
        System.out.println("message1 = " + message);
    }
    /**
     * 一个消费者
     *
     * @param message
     */
    @RabbitListener(queuesToDeclare = @Queue("sp_test"))
    public void receive2(String message) {
        System.out.println("message2 = " + message);
    }
}

2.3.3 Public

新建路由:

生产者:

@Component
public class Test01 {
    /**
     * 注入rabbitTemplate
     */
    @Autowired
    private RabbitTemplate rabbitTemplate;
    /**
     * Fanout 广播
     */
    public void testFanout() {
        /**
         *  参数1: 交换机名称
         *  参数2: routingKey
         *  参数3: message
         * */
        rabbitTemplate.convertAndSend("test_fanout", "", "Fanout的模型发送的消息");
    }
}

消费者:

@Component
public class Consumer2 {
    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue,//创建临时队列
                    exchange = @Exchange(value = "test_fanout", type = "fanout")  //绑定的交换机
            )
    })
    public void receive1(String message) {
        System.out.println("message1 = " + message);
    }
    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue,//创建临时队列
                    exchange = @Exchange(value = "test_fanout", type = "fanout")  //绑定的交换机
            )
    })
    public void receive2(String message) {
        System.out.println("message2 = " + message);
    }
}

测试:

@SpringBootTest
class SpRabbitmqApplicationTests {
    @Autowired
    private Test01 test01;
    @Test
    void producerTest01() {
        test01.testFanout();
    }
}

2.3.4 Routing

创建交换机:

生产者:

@Component
public class Test01 {
    /**
     * 注入rabbitTemplate
     */
    @Autowired
    private RabbitTemplate rabbitTemplate;
    /**
     * Route 路由模式
     */
    public void testRoute() {
        /**
         *  参数1: 交换机名称
         *  参数2: 路由key
         *  参数3: 发送的信息
         * */
         rabbitTemplate.convertAndSend("test_routing", "info", "发送info的key的路由信息");
    }
}

消费者:

@Component
public class Consumer3 {
    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue,//创建临时队列
                    exchange = @Exchange(value = "test_routing", type = "direct"),//自定交换机名称和类型
                    key = {"info", "error", "warn"}
            )
    })
    public void receive1(String message) {
        System.out.println("message1 = " + message);
    }
    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue,
                    exchange = @Exchange(value = "test_routing", type = "direct"),
                    key = {"error"}
            )
    })
    public void receive2(String message) {
        System.out.println("message2 = " + message);
    }
}

测试:

@SpringBootTest
class SpRabbitmqApplicationTests {
    @Autowired
    private Test01 test01;
    @Test
    void producerTest01() {
        test01.testRoute();
    }
}

2.3.5 Topics

添加交换机:

生产者:

@Component
public class Test01 {
    /**
     * 注入rabbitTemplate
     */
    @Autowired
    private RabbitTemplate rabbitTemplate;
    /**
     * Topic 动态路由  订阅模式
     */
    public void testTopic() {
        /**
         *  参数1: 交换机名称
         *  参数2: 路由key
         *  参数3: 发送的消息
         * */
        rabbitTemplate.convertAndSend("test_topic", "ymx.name.Mr_YanMingXin", "ymx路由消息");
    }
}

消费者:

@Component
public class Consumer4 {
    /**
     * "*"代表一个单词,"#"代表0到多个单词
     *
     * @param message
     */
    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue,
                    exchange = @Exchange(type = "topic", name = "test_topic"),
                    key = {"ymx.name", "ymx.name.*"}
            )
    })
    public void receive1(String message) {
        System.out.println("message1 = " + message);
    }
    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue,
                    exchange = @Exchange(type = "topic", name = "test_topic"),
                    key = {"ymx.#", "ymx.name.#"}
            )
    })
    public void receive2(String message) {
        System.out.println("message2 = " + message);
    }
}

测试:

@SpringBootTest
class SpRabbitmqApplicationTests {
    @Autowired
    private Test01 test01;
    @Test
    void producerTest01() {
        test01.testTopic();
    }
}

3 小总结下

  • 消费者是不需要手动去调用的,只需要写上一个带参数的方法和打上@RabbitListener注解,在项目运行时就可以自己进行消费了
  • public中之所以没有指定routingKey是因为这种模式下会向全部的消费者发送消息,写上也没什么意义
  • @RabbitListener可以写在方法上也可以写在类上,写在类上时,方法上就要打上@RabbitHandler注解
  • 还有其他需要注意的欢迎交流~


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
3月前
|
消息中间件 Java 网络架构
|
3月前
|
消息中间件 Java 测试技术
消息中间件RabbitMQ---SpringBoot整合RabbitMQ【三】
这篇文章是关于如何在SpringBoot应用中整合RabbitMQ的消息中间件。内容包括了在SpringBoot项目中添加RabbitMQ的依赖、配置文件设置、启动类注解,以及如何通过单元测试来创建交换器、队列、绑定,并发送和接收消息。文章还介绍了如何配置消息转换器以支持对象的序列化和反序列化,以及如何使用注解`@RabbitListener`来接收消息。
消息中间件RabbitMQ---SpringBoot整合RabbitMQ【三】
|
3月前
|
消息中间件 Java RocketMQ
微服务架构师的福音:深度解析Spring Cloud RocketMQ,打造高可靠消息驱动系统的不二之选!
【8月更文挑战第29天】Spring Cloud RocketMQ结合了Spring Cloud生态与RocketMQ消息中间件的优势,简化了RocketMQ在微服务中的集成,使开发者能更专注业务逻辑。通过配置依赖和连接信息,可轻松搭建消息生产和消费流程,支持消息过滤、转换及分布式事务等功能,确保微服务间解耦的同时,提升了系统的稳定性和效率。掌握其应用,有助于构建复杂分布式系统。
67 0
|
4月前
|
消息中间件 Java Kafka
Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
187 5
|
4月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的工厂生产设备维护管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的工厂生产设备维护管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
56 6
|
4月前
|
消息中间件 Shell
mq报错abbit@syld36: * connected to epmd (port 4369) on syld36 * epmd reports node ‘rabbit‘ uses po
mq报错abbit@syld36: * connected to epmd (port 4369) on syld36 * epmd reports node ‘rabbit‘ uses po
73 0
|
4月前
|
消息中间件 Java 数据安全/隐私保护
Spring Boot与RabbitMQ的集成
Spring Boot与RabbitMQ的集成
|
4月前
|
消息中间件 Java RocketMQ
Spring Boot与RocketMQ的集成
Spring Boot与RocketMQ的集成
|
4月前
|
消息中间件 Java Spring
实现Spring Boot与RabbitMQ消息中间件的无缝集成
实现Spring Boot与RabbitMQ消息中间件的无缝集成
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。