SpringBoot筆記--RabbitMQ簡單模式&工作隊列模式

一、前言

RabbitMQ的簡單模式(Hello World)與工作隊列模式(Work queues),都是Producer直接向指定隊列發(fā)送消息,無需交換機。如果只有一個Consumer注冊到該隊列,則為簡單模式,如果有多個Consumer注冊到該隊列,則為工作隊列模式,工作隊列模式時,默認(rèn)多個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 服務(wù)器
      rabbitmq:
          host: 192.168.31.136
          port: 5672
          username: admin
          password: admin
          virtual-host: myhost #指定vhost

3.RabbitMqConfig.java 創(chuàng)建隊列

由于簡單模式和工作隊列模式都不需要交換機,所以無需綁定交換機。

@Configuration
public class RabbitMqConfig {

    public static final String WORK_QUEUE = "work-queue-1";

    /**
     * 創(chuàng)建一個名為work-queue-1的隊列。
     * @return
     */
    @Bean
    public Queue createQueue(){
        return new Queue(WORK_QUEUE);
    }
}
創(chuàng)建名為work-queue-1的隊列.png

程序啟動后,在RabbitMQ的web界面就能看到該隊列,隊列創(chuàng)建成功后,consumer方可監(jiān)聽該隊列。如果沒有該隊列,Consumer啟動的時候,會報錯org.springframework.amqp.rabbit.listener.BlockingQueueConsumer$DeclarationException: Failed to declare queue(s):[work-queue-1],程序會啟動失敗。

4.Producer發(fā)送消息

@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

當(dāng)調(diào)用/send/work-queue后,Producer端就會向RabbitMQ隊列發(fā)送一條消息,至此,一條消息就存儲在了隊列里,等待著Consumer來消費了。接下來,我們來實現(xiàn)Consumer端吧。

5.Consumer消費消息

如果Consumer是另外一個springboot工程,則pom.xml、application.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方法在監(jiān)聽該隊列,則為簡單模式,若增加了receiver02同時監(jiān)聽同一個隊列,則為工作隊列模式,輪流消費。

輪流消費.png

Consumer啟動后,如上圖所示,消息將被消費。

已被消費.png

查看RabbitMQ上的隊列信息,消息都已被消費。

以上!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容