进入正题,本文会介绍两种实现rabbitmq的ack模式的方法,分别为:
一、通过配置文件配置。
二、通过手动注册 SimpleMessageListenerContainer容器实现。
先介绍方法一:
通过配置文件配置。
此类实现起来较为方便,通过springboot的配置文件以及注解的形式即可完成。
1.首先引入依赖:
org.springframework.boot
spring-boot-starter-amqp
2.编写配置文件
# rabbitmq基本配置
spring.rabbitmq.host=***
spring.rabbitmq.port=5672
spring.rabbitmq.username=***
spring.rabbitmq.password=***
spring.rabbitmq.virtual-host=/
# 开启发送确认
spring.rabbitmq.publisher-confirms=true
# 开启发送失败退回
spring.rabbitmq.publisher-returns=true
# 全局开启ACK
spring.rabbitmq.listener.simple.acknowledge-mode=manual
在配置文件中使用
spring.rabbitmq.listener.simple.acknowledge-mode
来配置ack模式,这个配置有三种配置方式,分别为NONE、MANUAL、AUTO。
I:NONE:默认为NONE,也就是自动ack模式,在消费者接受到消息后无需手动ack,消费者会自动将消息ack掉。
II:MANUAL:即为手动ack模式,消费者在接收到消息后需要手动ack消息,不然消息将一直处于uncheck状态,在应用下次启动的时候会再次对消息进行消费。使用该配置需要注意的是,配置开启后即项目全局开启手动ack模式,所有的消费者都需要在消费信息后手动ack消息,否则在重启应用的时候将会有大量的消息无法被消费掉而重复消费。
III:AUTO:自动确认ack 如果此时消费者抛出异常,不同的异常会有不同的处理方式。
3.编写MQConfig的代码,实现相应的queue和exchange的注册以及绑定。
/**
* ACK 测试
*/
public static final String ACK_QUEUE_A = "ack.test.queue.A";
public static final String ACK_QUEUE_B = "ack.test.queue.B";
public static final String ACK_EXCHANGE = "ack.test.exchange";
/**
* ACK TEST
*/
@Bean
public Queue ackQueueA() {
return new Queue(ACK_QUEUE_A);
}
@Bean
public Queue ackQueueB() {
return new Queue(ACK_QUEUE_B);
}
@Bean
public FanoutExchange ackFanoutExchange() {
return new FanoutExchange(ACK_EXCHANGE);
}
@Bean
public Binding ackBindingA() {
return BindingBuilder.bind(ackQueueA()).to(ackFanoutExchange());
}
@Bean
public Binding ackBindingB() {
return BindingBuilder.bind(ackQueueB()).to(ackFanoutExchange())