Spring Boot整合RabbitMQ

一、开发中的大概过程

  • 生产者工程:

    1. application.yml文件配置RabbitMQ相关信息;

    2. 在生产者工程中编写配置类,用于创建交换机和队列,并进行绑定

    3. 注入RabbitTemplate对象,通过RabbitTemplate对象发送消息到交换机

  • 消费者工程:

    1. application.yml文件配置RabbitMQ相关信息

    2. 创建消息处理类,用于接收队列中的消息并进行处理

二、添加依耐和相应配置

  • 生产者、消费者一样需要配置

  • 导入坐标

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.4.RELEASE</version>
        </parent>
        <groupId>com.itheima</groupId>
        <artifactId>springboot-rabbitmq</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-amqp</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
        </dependencies>
    </project>
    
  • 配置rabbitmq相关信息

    spring:
      rabbitmq:
        host: 127.0.0.1
        port: 5672
        username: nov17
        password: nov17
        virtual-host: testhost
    

    重点掌握后面的几种工作模式的特点以及使用方法

三、RabbitMQ工作模式

1)提前了解
  • 常用的交换机

    • DirectExchange:直连型交换机,根据消息携带的路由键,将消息转发给对应的队列

    • FanoutExchange:扇形交换机,接收到消息后会将消息转发到所有队列

    • TopicExchange:主题交换机,根据消息携带的路由键和交换机与队列绑定键的规则,将消息转发给对应的队列

  • 规则

    • #:匹配一个或多个词
    • *:匹配不多不少恰好1个词
2)简单模式 HelloWorld
  • 一个生产者、一个消费者,不需要设置交换机(使用默认的交换机)

  • 生产者代码:

    创建RabbitMQ队列配置类com.example.rabbitmq_producer.config;

    @Configuration
    public class RabbitMQConfig {
    
        //队列名称
        public static final String SIMPLE_QUEUE = "simple_queue";
    
        //声明队列
        @Bean("simpleQueue")
        public Queue simpleQueue(){
            return QueueBuilder.durable(SIMPLE_QUEUE).build();
        }
    
    }
    
  • 消费者代码:

    编写消息监听器com.example.rabbitmq_consumer.listener;

    @Component
    public class MyListener {
    
    	/**
         * 监听某个队列的消息
         * @param message 接收到的消息
         */
        @RabbitListener(queues = "simple_queue")
        public void printMsg(String msg) {
            System.out.println("消费者接收到的消息为:" + msg);
        }
    
    }
    
  • 测试代码

    在生产者工程springboot-rabbitmq-producer中创建测试类,发送消息:

    @SpringBootTest
    public class RabbitMQTest {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Test
        public void test(){
            rabbitTemplate.convertAndSend(RabbitMQConfig.SIMPLE_QUEUE, "rabbitmq helloworld ...");
            System.out.println("消息发送成功");
        }
    
    }
    
3)工作队列模式 Work Queue
  • 一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认的交换机)

  • 生产者代码:

    创建RabbitMQ队列配置类com.example.rabbitmq_producer.config;

    @Configuration
    public class RabbitMQConfig {
    
        //队列名称
        public static final String WORK_QUEUE = "work_queue";
    
        //声明队列
        @Bean("workQueue")
        public Queue workQueue(){
            return QueueBuilder.durable(WORK_QUEUE).build();
        }
    
    }
    
  • 消费者代码:

    编写消息监听器com.example.rabbitmq_consumer.listener;

    消费者1:

    @Component
    public class MyListener {
    
    	/**
         * 监听某个队列的消息
         * @param message 接收到的消息
         */
        @RabbitListener(queues = "work_queue")
        public void printMsg(String msg) {
            System.out.println("消费者1接收到的消息为:" + msg);
        }
    
    }
    
  • 消费者2:

    @Component
    public class MyListener {
    
    	/**
         * 监听某个队列的消息
         * @param message 接收到的消息
         */
        @RabbitListener(queues = "work_queue")
        public void printMsg(String msg) {
            System.out.println("消费者2接收到的消息为:" + msg);
        }
    
    }
    
  • 测试代码

    在生产者工程springboot-rabbitmq-producer中创建测试类,发送消息:

    @SpringBootTest
    public class RabbitMQTest {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Test
        public void test(){
            rabbitTemplate.convertAndSend(RabbitMQConfig.WORK_QUEUE, "rabbitmq work queue ...");
            System.out.println("消息发送成功");
        }
    
    }
    
4)发布订阅模式 Publish/subscribe
  • 需要设置类型为fanout的交换机,并且交换机和队列进行绑定,当发送消息到交换机后,交换机会将消息发送到绑定的队列

  • 生产者代码

    创建RabbitMQ队列配置类com.example.rabbitmq_producer.config;

    @Configuration
    public class RabbitMQConfig {
    
        //交换机名称
        public static final String ITEM_PS_EXCHANGE = "item_ps_exchange";
        //队列名称
        public static final String ITEM_QUEUE1 = "item_queue1";
        public static final String ITEM_QUEUE2 = "item_queue2";
    
        //声明交换机
        @Bean("itemPsExchange")
        public FanoutExchange PsExchange(){
            return ExchangeBuilder.fanoutExchange(ITEM_PS_EXCHANGE).build();
        }
    
        //声明队列
        @Bean("itemQueue1")
        public Queue itemQueue1(){
            return QueueBuilder.durable(ITEM_QUEUE1).build();
        }
        @Bean("itemQueue2")
        public Queue itemQueue2(){
            return QueueBuilder.durable(ITEM_QUEUE2).build();
        }
    
        //绑定队列和交换机
        @Bean
        public Binding itemQueueExchange1(@Qualifier("itemQueue1") Queue queue,
                                         @Qualifier("itemPsExchange") FanoutExchange exchange){
            return BindingBuilder.bind(queue).to(exchange);
        }
        @Bean
        public Binding itemQueueExchange2(@Qualifier("itemQueue2") Queue queue,
                                          @Qualifier("itemPsExchange") FanoutExchange exchange){
            return BindingBuilder.bind(queue).to(exchange);
        }
    
    }
    
  • 消费者代码

    编写消息监听器com.example.rabbitmq_consumer.listener;

    消费者1:

    @Component
    public class MyListener {
    
        @RabbitListener(queues = "item_queue1")
        public void printMsg(String msg) {
            System.out.println("消费者1接收到的消息为:" + msg);
        }
    
    }
    

    消费者2:

    @Component
    public class MyListener {
    
        @RabbitListener(queues = "item_queue2")
        public void printMsg(String msg) {
            System.out.println("消费者2接收到的消息为:" + msg);
        }
    
    }
    
  • 测试代码

    在生产者工程springboot-rabbitmq-producer中创建测试类,发送消息:

    @SpringBootTest
    public class RabbitMQTest {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Test
        public void test(){
            rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_PS_EXCHANGE,"", "rabbitmq pub/sub ...");
            System.out.println("消息发送成功");
        }
    
    }
    
5)路由模式 Routing
  • 需要设置类型为direct的交换机,交换机和队列进行绑定,并且指定routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列

  • 生产者代码:

    创建RabbitMQ队列配置类com.example.rabbitmq_producer.config;

    @Configuration
    public class RabbitMQConfig {
    
        //交换机名称
        public static final String ITEM_ROUTING_EXCHANGE = "item_routing_exchange";
        //队列名称
        public static final String ITEM_QUEUE1 = "item_queue1";
        public static final String ITEM_QUEUE2 = "item_queue2";
    
        //声明交换机
        @Bean("itemPsExchange")
        public Exchange PsExchange(){
            return ExchangeBuilder.directExchange(ITEM_ROUTING_EXCHANGE).build();
        }
    
        //声明队列
        @Bean("itemQueue1")
        public Queue itemQueue1(){
            return QueueBuilder.durable(ITEM_QUEUE1).build();
        }
        @Bean("itemQueue2")
        public Queue itemQueue2(){
            return QueueBuilder.durable(ITEM_QUEUE2).build();
        }
    
        //绑定队列和交换机
        @Bean
        public Binding itemQueueExchange1(@Qualifier("itemQueue1") Queue queue,
                                         @Qualifier("itemPsExchange") Exchange exchange){
            return BindingBuilder.bind(queue).to(exchange).with("info").noargs();
        }
        @Bean
        public Binding itemQueueExchange2(@Qualifier("itemQueue2") Queue queue,
                                          @Qualifier("itemPsExchange") Exchange exchange){
            return BindingBuilder.bind(queue).to(exchange).with("error").noargs();
        }
    
    }
    
  • 消费者代码:

    编写消息监听器com.example.rabbitmq_consumer.listener;

    消费者1:

    @Component
    public class MyListener {
    
        @RabbitListener(queues = "item_queue1")
        public void printMsg(String msg) {
            System.out.println("消费者1接收到的消息为:" + msg);
        }
    
    }
    

    消费者2:

    @Component
    public class MyListener {
    
        @RabbitListener(queues = "item_queue2")
        public void printMsg(String msg) {
            System.out.println("消费者2接收到的消息为:" + msg);
        }
    
    }
    
  • 测试代码:

    在生产者工程springboot-rabbitmq-producer中创建测试类,发送消息:

    @SpringBootTest
    public class RabbitMQTest {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Test
        public void test(){
            rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_ROUTING_EXCHANGE,"error", "rabbitmq routing ...");
            System.out.println("消息发送成功");
        }
    
    }
    
6)通配符模式 Topic
  • 需要设置类型为topic的交换机,交换机和队列进行绑定,并且指定通配符方式的routing key,当发送消息到交换机后,交换机会根据routing key将消息发送到对应的队列

    Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert

    通配符规则:

    #:匹配一个或多个词

    *:匹配不多不少恰好1个词

  • 生产者代码:

    创建RabbitMQ队列配置类com.example.rabbitmq_producer.config;

    @Configuration
    public class RabbitMQConfig {
    
        //交换机名称
        public static final String ITEM_TOPIC_EXCHANGE = "item_topic_exchange";
        //队列名称
        public static final String ITEM_QUEUE1 = "item_queue1";
        public static final String ITEM_QUEUE2 = "item_queue2";
    
        //声明交换机
        @Bean("itemPsExchange")
        public Exchange PsExchange(){
            return ExchangeBuilder.topicExchange(ITEM_TOPIC_EXCHANGE).build();
        }
    
        //声明队列
        @Bean("itemQueue1")
        public Queue itemQueue1(){
            return QueueBuilder.durable(ITEM_QUEUE1).build();
        }
        @Bean("itemQueue2")
        public Queue itemQueue2(){
            return QueueBuilder.durable(ITEM_QUEUE2).build();
        }
    
        //绑定队列和交换机
        @Bean
        public Binding itemQueueExchange1(@Qualifier("itemQueue1") Queue queue,
                                         @Qualifier("itemPsExchange") Exchange exchange){
            return BindingBuilder.bind(queue).to(exchange).with("info.#").noargs();
        }
        @Bean
        public Binding itemQueueExchange2(@Qualifier("itemQueue2") Queue queue,
                                          @Qualifier("itemPsExchange") Exchange exchange){
            return BindingBuilder.bind(queue).to(exchange).with("error.#").noargs();
        }
    
    }
    
  • 消费者代码:

    编写消息监听器com.example.rabbitmq_consumer.listener;

    消费者1:

    @Component
    public class MyListener {
    
        @RabbitListener(queues = "item_queue1")
        public void printMsg(String msg) {
            System.out.println("消费者1接收到的消息为:" + msg);
        }
    
    }
    

    消费者2:

    @Component
    public class MyListener {
    
        @RabbitListener(queues = "item_queue2")
        public void printMsg(String msg) {
            System.out.println("消费者2接收到的消息为:" + msg);
        }
    
    }
    
  • 测试代码:

    在生产者工程springboot-rabbitmq-producer中创建测试类,发送消息:

    @SpringBootTest
    public class RabbitMQTest {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        @Test
        public void test(){
            rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_TOPIC_EXCHANGE,"info.select", "rabbitmq info.select ...");
            rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_TOPIC_EXCHANGE,"info.insert", "rabbitmq info.insert ...");
            rabbitTemplate.convertAndSend(RabbitMQConfig.ITEM_TOPIC_EXCHANGE,"error.delete", "rabbitmq error.delete ...");
            System.out.println("消息发送成功");
        }
    
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值