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)确认消息消费失败

你可能感兴趣的:(工具)