rabbitmq消息重发的设置

application.properties配置

server.port=8091 srping.rabbitmq.host=localhost srping.rabbitmq.port=5672 spring.rabbitmq.username=user spring.rabbitmq.password=123 spring.rabbitmq.publisher-confirms=true spring.rabbitmq.virtual-host=/vhost_user

spring.rabbitmq.publisher-returns=true spring.rabbitmq.listener.direct.acknowledge-mode=manual spring.rabbitmq.listener.simple.acknowledge-mode=manual spring.rabbitmq.listener.simple.retry.enabled=true

消费者: @RabbitListener(queues = “hello”) @RabbitHandler public void processor(Channel channel, Message message) throws IOException {

try {
		System.out.println("receiver:" + new String(message.getBody()));
		channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
	} catch (Exception e) {
		System.out.println("receiver false");
		channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
	}
}

消息监听内必须使用channel对消息进行确认,不管是确认消费成功还是确认消费失败 消息监听内的异常处理有两种方式:

内部catch后直接处理,然后使用channel对消息进行确认 配置RepublishMessageRecoverer将处理异常的消息发送到指定队列专门处理或记录 监听的方法内抛出异常貌似没有太大用处。因为抛出异常就算是重试也非常有可能会继续出现异常,当重试次数完了之后消息就只有重启应用才能接收到了,很有可能导致消息消费不及时。当然可以配置RepublishMessageRecoverer来解决,但是万一RepublishMessageRecoverer发送失败了呢。。那就可能造成消息消费不及时了。所以即使需要将处理出现异常的消息统一放到另外队列去处理,个人建议两种方式:

catch异常后,手动发送到指定队列,然后使用channel给rabbitmq确认消息已消费 给Queue绑定死信队列,使用nack(requque为false)确认消息消费失败

经验分享 程序员 微信小程序 职场和发展