美文网首页
SpringBoot笔记--RabbitMQ简单模式&工作队列模

SpringBoot笔记--RabbitMQ简单模式&工作队列模

作者: Sunny旋律 | 来源:发表于2022-04-11 23:46 被阅读0次

    一、前言

    RabbitMQ的简单模式(Hello World)与工作队列模式(Work queues),都是Producer直接向指定队列发送消息,无需交换机。如果只有一个Consumer注册到该队列,则为简单模式,如果有多个Consumer注册到该队列,则为工作队列模式,工作队列模式时,默认多个Consumer轮流处理消息。


    简单模式(Hello World).png 工作队列模式(Work queues).png 工作队列模式多Consumer轮流处理消息.png

    二、上代码

    1.pom.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    

    2.application.yml

      spring:
          #配置rabbitMq 服务器
          rabbitmq:
              host: 192.168.31.136
              port: 5672
              username: admin
              password: admin
              virtual-host: myhost #指定vhost
    

    3.RabbitMqConfig.java 创建队列

    由于简单模式和工作队列模式都不需要交换机,所以无需绑定交换机。

    @Configuration
    public class RabbitMqConfig {
    
        public static final String WORK_QUEUE = "work-queue-1";
    
        /**
         * 创建一个名为work-queue-1的队列。
         * @return
         */
        @Bean
        public Queue createQueue(){
            return new Queue(WORK_QUEUE);
        }
    }
    
    创建名为work-queue-1的队列.png

    程序启动后,在RabbitMQ的web界面就能看到该队列,队列创建成功后,consumer方可监听该队列。如果没有该队列,Consumer启动的时候,会报错org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to declare queue(s):[work-queue-1],程序会启动失败。

    4.Producer发送消息

    @RestController
    @RequestMapping(value = "send")
    public class ProducerController {
    
        @Resource
        private RabbitTemplate rabbitTemplate;
    
        @GetMapping("work-queue")
        public void sendWorkQueue(){
            String msg = "work queue msg" + new Date().toString();
            rabbitTemplate.convertAndSend(RabbitMqConfig.WORK_QUEUE, msg);
        }
    }
    
    work-queue-1队列收到一条消息.png

    当调用/send/work-queue后,Producer端就会向RabbitMQ队列发送一条消息,至此,一条消息就存储在了队列里,等待着Consumer来消费了。接下来,我们来实现Consumer端吧。

    5.Consumer消费消息

    如果Consumer是另外一个springboot工程,则pom.xmlapplication.yml配置保持和上面1、2步保持一样。

    @Component
    public class RabbitMqReceiver {
    
        private final static Logger logger = LoggerFactory.getLogger(RabbitMqReceiver.class);
    
        @RabbitListener(queues = RabbitMqConfig.WORK_QUEUE)
        public void receiver01(String msg, Channel channel, Message message) throws IOException {
            logger.info("receiver01 接收到消息为:"+msg);
        }
    
        @RabbitListener(queues = RabbitMqConfig.WORK_QUEUE)
        public void receiver02(String msg, Channel channel, Message message) throws IOException {
            logger.info("receiver02 接收到消息为:"+msg);
        }
    }
    

    如果只有一个receiver01方法在监听该队列,则为简单模式,若增加了receiver02同时监听同一个队列,则为工作队列模式,轮流消费。

    轮流消费.png

    Consumer启动后,如上图所示,消息将被消费。

    已被消费.png

    查看RabbitMQ上的队列信息,消息都已被消费。

    以上!

    相关文章

      网友评论

          本文标题:SpringBoot笔记--RabbitMQ简单模式&工作队列模

          本文链接:https://www.haomeiwen.com/subject/ggowsrtx.html