rabbitmq消費者設置手動ack

爲何要設置手動ack,消息確認

  1. 設置主動的主要做用是進行消息確認,
  2. 自動確認會在消息發送給消費者後當即確認,若是手動則當消費者調用ack,nack,reject幾種方法時進行確認.
  3. 通常會設置手動模式,業務失敗後能夠進行一些操做.java

    //消息的標識,false只確認當前一個消息收到,true確認全部consumer得到的消息spring

    channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);

    //ack返回false,並從新回到隊列,api裏面解釋得很清楚api

    channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);

    //拒絕消息ide

    channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);

     

如何設置手動ack

1,設置消費監聽配置
  acknowledge="manual"spa

<rabbit:listener-container   
		connection-factory="connectionFactory" acknowledge="manual">
		<!-- queues 監聽隊列,多個用逗號分隔 ref 監聽器 -->
		<rabbit:listener queues="test_queue_key2" ref="Consumer2" />
	</rabbit:listener-container>

2,實現ChannelAwareMessageListener 接口code

package com.mq.rabbitmq;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.ChannelAwareMessageListener;

import com.rabbitmq.client.Channel;

public class ChannleConsumer implements ChannelAwareMessageListener {

	@Override
	public void onMessage(Message message, Channel channel) throws Exception {
		try {
			//消息的標識,false只確認當前一個消息收到,true確認全部consumer得到的消息
			channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
			System.out.println("onMessage方法結束");
		} catch (Exception e) {
			//ack返回false,並從新回到隊列,api裏面解釋得很清楚
			channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
			e.printStackTrace();
			System.out.println("onMessage方法異常結束");
		}
	}

}
相關文章
相關標籤/搜索