一、前言
RabbitMQ的简单模式(Hello World)与工作队列模式(Work queues),都是Producer直接向指定队列发送消息,无需交换机。如果只有一个Consumer注册到该队列,则为简单模式,如果有多个Consumer注册到该队列,则为工作队列模式,工作队列模式时,默认多个Consumer轮流处理消息。
二、上代码
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);
}
}
程序启动后,在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);
}
}
当调用/send/work-queue
后,Producer端就会向RabbitMQ队列发送一条消息,至此,一条消息就存储在了队列里,等待着Consumer来消费了。接下来,我们来实现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
方法在监听该队列,则为简单模式,若增加了receiver02
同时监听同一个队列,则为工作队列模式,轮流消费。
Consumer启动后,如上图所示,消息将被消费。
查看RabbitMQ上的队列信息,消息都已被消费。
以上!