在上篇中主要讲到了RabbitMQ处理幂等性,这篇主要讲到手动响应消息配置。
RabbitMQ默认采用自动应答消息,方法执行没有异常就会算消息正常消费完成,但是某些业务场景下如报错等需要自己手动应答
修改配置文件
spring:
rabbitmq:
listener:
simple:
retry:
# 开启消费者重试机制(默认就是true,false则取消重试机制)
enabled: true
# manual: 手动应答,auto: 自动应答(默认)
acknowledge-mode: manual
生产者处理方式:
@Component
public class P2PUserConsumer {
/**
* RabbitMQ 消息手动应答
*/
@RabbitListener(queues = "USER")
public void receiveManual(Message msg, @Headers Map<String, Object> headers, Channel channel) throws IOException {
try {
String str = new String(msg.getBody(),"utf-8");
System.out.println("消费者消费:" + str);
// 抛出一个运行时异常,模仿消费异常
throw new RuntimeException();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 消息手动应答
Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
channel.basicAck(deliveryTag, false);
}
}
}