1. 程式人生 > >rabbitmq訊息重發的設定

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)確認訊息消費失敗