一.工作模型 (多個消費者):
一個生產者、多個消費者。
紅色:隊列
一個消息只能被一個消費者獲取。
項目使用上一篇中的項目 rabbitmq-produce、rabbitmq-consumer
二.rabbitmq-consumer的改動
2.1 在rabbitmq-consumer 中,新增一個消費者RabbitMqConsumer2類
RabbitMqConsumer2的代碼如下:
package com.example.rabbitmqconsumer.consumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 基本消息模型(簡單隊列) 的消息消費者
* @RabbitListener(queues = "simpleQueue") 監聽名爲simpleQueue的隊列
*/
@Component
@RabbitListener(queues = "simpleQueue")
public class RabbitMqConsumer2 {
@Autowired
private AmqpTemplate rabbitmqTemplate;
private Logger logger = LoggerFactory.getLogger(RabbitMqConsumer2.class);
/**
* 消費消息
* @RabbitHandler 代表此方法爲接受到消息後的處理方法
*/
@RabbitHandler
public void receiveMessage(String msg){
logger.info("消費者2接收到的消息 :" + msg);
}
}
三.rabbitmq-produce的改動
3.1 在rabbitmq-produce的配置文件application.yml有個注意點
RabbitMQ 將消息順序發送給多個消費者有兩種模式(公平分發、輪詢模式),
區別在於公平分發的prefetch默認是1,如果設置爲0就是輪詢模式。
1、公平分發:消費者1和消費者2獲取到的消息內容是不同的,同一個消息只能被一個消費者獲取。
2、輪詢模式: 消費者1和消費者2獲取到的消息的數量是相同的,一個是消費奇數號消息,一個是偶數。
四.測試
首先啓動生產者rabbitmq-produce項目。在postman或瀏覽器上訪問:
http://localhost:8783/TestController/testSimpleQueue POST請求
這時可以在rabbitmq-produce的控制檯可以看到
在rabbitMQ的可視化頁面中可以看到10個消息生成
然後再啓動消費者rabbitmq-consumer工程,在rabbitmq-consumer可以看到:
兩個消費者平均獲取到消息,這就是輪詢模式。
在rabbitMQ的可視化頁面中可以看到10個消息已經被消費掉了