在前面的章节中,消费者都是自动应答的:

  • 《消息中间件系列教程(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里开启了手动应答,如果不手动应答,消息队列里会一直存在消息。

消息中间件系列教程(16) -RabbitMQ-应答模式_github

消息中间件系列教程(16) -RabbitMQ-应答模式_消息中间件_02

4.开启手动应答,而且代码里也回复了,消息队列里面的消息也会别消费。

消息中间件系列教程(16) -RabbitMQ-应答模式_github_03

消息中间件系列教程(16) -RabbitMQ-应答模式_github_04

本文代码已上传至Github,有兴趣的同学可以下载来看看:https://github.com/ylw-github/SpringBoot-RabbitMQ-Demo.git