文章目錄
-
-
-
- 一、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);
}
}
}