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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值