一、前言
RabbitMQ的簡單模式(Hello World)與工作隊列模式(Work queues),都是Producer直接向指定隊列發(fā)送消息,無需交換機。如果只有一個Consumer注冊到該隊列,則為簡單模式,如果有多個Consumer注冊到該隊列,則為工作隊列模式,工作隊列模式時,默認(rèn)多個Consumer輪流處理消息。



二、上代碼
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);
}
}

程序啟動后,在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);
}
}

當(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)聽同一個隊列,則為工作隊列模式,輪流消費。

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

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