RabbitMQ消费者消息确认的三种机制:
- 自动确认(AcknowledgeMode.NONE)
- RabbitMQ消费者默认为自动确认,不会管消费者是否成功消费/处理了消息
- 根据情况确认(AcknowledgeMode.AUTO)
- 如果消息成功被消费(成功的意思是在消费的过程中没有抛出异常),则自动确认
- 当抛出 AmqpRejectAndDontRequeueException 异常的时候,则消息会被拒绝,且 requeue = false(不重新入队列)
- 当抛出 ImmediateAcknowledgeAmqpException 异常,则消费者会被确认
- 其他的异常,则消息会被拒绝,且 requeue = true(如果此时只有一个消费者监听该队列,则有发生死循环的风险,多消费端也会造成资源的极大浪费,这个在开发过程中一定要避免的)。可以通过 setDefaultRequeueRejected(默认是true)去设置
- 手动确认(AcknowledgeMode.MANUAL)
- 消费者收到消息后,手动对消息进行处理,完成消费
- Basic.Ack :用于确认当前消息
- Basic.Nack :用于否定当前消息
- Basic.Reject :用于拒绝当前消息
消息接收配置类
记得先把之前的监听类都注释掉
package com.chentawen.rabbitmqconsumer.config;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
/**
* 消息接收配置类
* @author admin
*/
@Configuration
public class MessageListenerConfig {
/**
* RabbitTemplate 连接工厂
*/
@Resource
private CachingConnectionFactory connectionFactory;
/**
* 消息接收处理类
*/
@Resource
private MyAckReceiver myAckReceiver;
@Bean
public SimpleMessageListenerContainer simpleMessageListenerContainer() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
// 消费者数量,默认10
container.setConcurr