最近在使用RabbitMQ作消息转发,供消费者使用,遇到了多消费者消费同一批数据的问题。
场景
1.多个消费者消费同一批数据;
2.每条数据每个消费者都要消费
解决方案:采用direct模式,消费者创建队列形式
生产端不创建队列,只负责把消息发送到交换机并指定routingKey,这里为了避免消息投递到RabbitMQ失败,采用了手动确认方式,如
# spring配置
# 手动确认消息投递情况
spring.rabbitmq.publisher-confirms: true
spring.rabbitmq.publisher-returns: true
spring.rabbitmq.template.mandatory: true
# java代码
@PostConstruct
public void init() {
rabbitTemplate.setConfirmCallback((correlationData, ack, error) -> {
System.out.println("消息唯一标识:" + correlationData);
System.out.println("确认结果:" + ack);
System.out.println("失败原因:" + error);
});
rabbitTemplate.setMandatory(true);
rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
System.out.println("消息主体