自动确认消费,不管 try 中有没有异常,消息管理界面上队列里的消息都被消费了,没有ready和unacked状态栏;
手动确认,未被消费的消息有多少条都会在ready状态栏下,分发到消费端后,消费端没有回发ack的消息会在unacked状态栏中。
MQ配置的时候,如果配置了json解析器。如下:
@Bean("exchangeSendPoEccIntegrationResult")
RabbitTemplate exchangeSendPoEccIntegrationResult(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
return rabbitTemplate;
}
则程序会走自动确认消费,配置文件的配置就不生效了
用代码设置手动确认。就OK了
/**
* 因为这个listener container 是自己创建的,会抑制spring boot自动配置
,所以这些配置就不生效了。spring.rabbitmq.listener.*
*
* @param connectionFactory
* @return
*/
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(jsonConverter());
factory.setErrorHandler(errorHandler());
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
return factory;
}
channel.basicNack(deliveryTag, false, true);
channel.basicAck(deliveryTag, false);
正确的消息被ack 了,那么在消费过程中有异常就需要channel.basicNack
第一,这条消息重新放回队列重新消费
第二,抛弃此条消息
MQ的并发:
1.采用全局锁(采用Zookeeper)