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

2022-04-11  本文已影响0人  Sunny旋律

一、前言

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上的队列信息,消息都已被消费。

以上!

上一篇下一篇

猜你喜欢

热点阅读