在前面的章节中,消费者都是自动应答的:
- 《消息中间件系列教程(13) -RabbitMQ-SpringBoot集成RabbitMQ》
- 《消息中间件系列教程(14) -RabbitMQ-自动补偿机制》
- 《消息中间件系列教程(15) -RabbitMQ-基于全局消息ID解决幂等性问题》
那么消费者可以手动应答吗?答案是可以的
下面基于《消息中间件系列教程(13) -RabbitMQ-SpringBoot集成RabbitMQ》的环境讲解下自动应答的核心代码。
1.application.yml里添加自动应答(最后一行):
server: port: 8082 spring: rabbitmq: ####连接地址 host: 127.0.0.1 ####端口号 port: 5672 ####账号 username: guest ####密码 password: guest ### 地址 virtual-host: / listener: simple: retry: ####开启消费者重试 enabled: true ####最大重试次数 max-attempts: 5 ####重试间隔次数 initial-interval: 3000 ####开启手动ack acknowledge-mode: manual
2.消费内容,手动应答:
@Component public class FanoutSmsConsumer { @RabbitListener(queues = "fanout_sms_queue") public void process(Message message, @Headers Map<String, Object> headers, Channel channel) throws Exception { System.out .println(Thread.currentThread().getName() + ",邮件消费者获取生产者消息msg:" + new String(message.getBody(), "UTF-8") + ",messageId:" + message.getMessageProperties().getMessageId()); // 手动ack Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG); // 手动签收 channel.basicAck(deliveryTag, false); } }
3.因为application.yml里开启了手动应答,如果不手动应答,消息队列里会一直存在消息。
4.开启手动应答,而且代码里也回复了,消息队列里面的消息也会别消费。
本文代码已上传至Github,有兴趣的同学可以下载来看看:https://github.com/ylw-github/SpringBoot-RabbitMQ-Demo.git