Work queues
,也被称为(Task queues
),任务模型。当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度。长此以往,消息就会堆积越来越多,无法及时处理。此时就可以使用work 模型:让多个消费者绑定到一个队列,共同消费队列中的消息。队列中的消息一旦消费,就会消失,因此任务是不会被重复执行的。(缺点:消费消息是一种轮循,也可以说是一种平均分配消息,做不到能者多劳,也就是已消费完的帮助未消费完的)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
application.properties
spring.rabbitmq.host=192.168.56.101
spring.rabbitmq.port=5673
spring.rabbitmq.username=test
spring.rabbitmq.password=123456
spring.rabbitmq.virtual-host=/ems
RabbitConfig
@Configuration
public class RabbitConfig {
//队列TestDirectQueue
@Bean
public Queue TestDirectQueue() {
// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
// exclusive:默认也是false,是否独占队列
// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
return new Queue("TestDirectQueue",true,false,false);
}
}
生产者
@RestController
public class SendMessageController {
@Autowired
RabbitTemplate rabbitTemplate; //使用RabbitTemplate,这提供了接收/发送等等方法
@GetMapping("/sendDirectMessage")
public String sendDirectMessage() {
for(int i = 0; i<20; i++) {
Map<String, Object> map = new HashMap<>();
map.put("messageId", i);
//使用默认交换机
rabbitTemplate.convertAndSend("", "TestDirectQueue", map);
}
return "ok";
}
}
消费者
@Component
@RabbitListener(queues = "TestDirectQueue")//监听的队列名称 TestDirectQueue
public class DirectReceiver {
@RabbitHandler
public void process(Map testMessage) {
System.out.println("DirectReceiver消费者收到消息1 : " + testMessage.toString());
}
}
@Component
@RabbitListener(queues = "TestDirectQueue")//监听的队列名称 TestDirectQueue
public class DirectReceiver2 {
@RabbitHandler
public void process(Map testMessage) throws InterruptedException {
Thread.sleep(2000);
System.out.println("DirectReceiver消费者收到消息2 : " + testMessage.toString());
}
}
设置了(Thread.sleep(2000))消费者2出现的比较慢