解决RabbitMQ 设置自定义消息后 广播消息无法ack
问题回溯:
在 primaryMessageListenerContainer 方法中 直接使用 SimpleMessageListenerContainer 创建自定义消息接收,导致 FANOUT(广播)消息无法确认,通过跟代码发现 报Channel closed; cannot ack/nack
解决方案
创建 一个SimpleRabbitListenerContainerFactory 新增 SimpleMessageListenerContainer
/**
* 定义监控队列容器
* @param connectionFactory 连接工厂
* @return 消息监控容器
*/
@Bean(name = "primarySimpleMessageListenerContainer")
public SimpleMessageListenerContainer primaryMessageListenerContainer(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory container = new SimpleRabbitListenerContainerFactory();
container.setConnectionFactory(connectionFactory);
//有条件地拒绝某种异常,即,消費消息时抛出的异常可以按情况处理
container.setDefaultRequeueRejected(false);
//设置批量消费
container.setConsumerBatchEnabled(false);
//进行流量控制
//非自动确认ACK模式下的限流和质量保证,在一定数目没有被确认前,消息是暂存rabbitmq内存中的,直到确认了,才会可能推送新的消息。
container.setPrefetchCount(prefetch);
container.setMessageConverter(new Jackson2JsonMessageConverter());
//手动确认消息
//container.setAcknowledgeMode(AcknowledgeMode.AUTO);
container.setAcknowledgeMode(mode);
//配置重试机制
//container.setAdviceChain();
// 配置发送确认回调时,次配置必须配置,否则即使在RabbitTemplate配置了ConfirmCallback也不会生效
SimpleMessageListenerContainer listenerContainer = container.createListenerContainer();
//设置监听器
listenerContainer.setMessageListener(listener);
listenerContainer.start();
return listenerContainer;
}