天天看點

RabbitMq--基礎原理

文章目錄

        • 一、RabbitMq的主要元件
            • 1、Exchange
            • 2、Queue(隊列)
        • 二、Ack(消息确認機制)
            • 1、手動确認

一、RabbitMq的主要元件

1、Exchange

exchage(交換機):

  type:direct(預設),fanout,topic,header

  

  durable:是否開啟持久化exchange

  autoDelete: 當已經沒有消費者時,伺服器是否可以删除該exchange

direct:

  direct類型的Exchange路由規則也很簡單,它會把消息路由到那些binding key與routing key完全比對的Queue中。

fanout:

  fanout類型的Exchange路由規則非常簡單,它會把所有發送到該Exchange的消息路由到所有與它綁定的Queue中。

topic:

  與direct類型的Exchange類似,也是把消息路由到那些binding key與routing key完全比對的Queue中,

  但又擴充了一些約定:

  1)、routing key為一個句點号“. ”分隔的字元串(我們将被句點号“. ”分隔開的每一段獨立的字元串稱為一個單詞),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”

  2)、binding key與routing key一樣也是句點号“. ”分隔的字元串

  3)、binding key中可以存在兩種特殊字元星号與“#”,用于做模糊比對,其中星号用于比對一個單詞,“#”用于比對多個單詞(注意:可以是零個)

2、Queue(隊列)

就是消息的暫存區/存儲區

二、Ack(消息确認機制)

在 RabbitMQ 中,消息确認處理機制有三種:Auto - 自動确認、Manual - 手動确認、None - 無需确認,而确認機制需要 listener implements ChannelAwareMessageListener 接口,并重寫其中的确認消費邏輯。

1、手動确認

channel.basicAck()

  參數解析

  deliveryTag:該消息的index

  multiple:是否批量處理.true:将一次性ack所有小于deliveryTag的消息。

channel.basicReject

  參數解析

  deliveryTag:該消息的index

  requeue:被拒絕的是否重新入隊列

/**
 * Created by yan on 2019/3/14.
 * 
 * Consumer的Listener監聽類
 */
@Component
public class RabbitMqListener implements ChannelAwareMessageListener {

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        
        try {
	        byte[] body = message.getBody();
	        //将消費的參數轉換為業務需要的類型
        	//TODO:調用service,編寫業務邏輯方法
            channel.basicAck(deliveryTag,true);
        }catch (Exception e){
            channel.basicReject(deliveryTag,false);
        }
    }
}