1. 程式人生 > >RabbitMQ (十一) 消息的參數詳解

RabbitMQ (十一) 消息的參數詳解

是個 gif public iba ret route timestamp odin amp

上篇文章講了聲明一個隊列時的參數設置,這篇文章主要說一說發布消息時的參數設置.

發布消息時的完整入參是這樣的:

技術分享圖片
                    channel.BasicPublish
                        (
                        exchange: "test_exchange",
                        routingKey: "",
                        mandatory: false,
                        basicProperties: null,
                        body: Encoding.Default.GetBytes(msg)
                        );
技術分享圖片

下面一一解釋:

exchange: 交換機名稱

routingKey:路由鍵

路由鍵的設置跟交換機的類型有關.

  • 如果交換機的類型是"fanout",那麽不管這個參數傳入的是啥,哪怕是個空字符串(不能是null),也不管與這個交換機綁定的隊列到底有沒有設置路由鍵,設置的是什麽.通通當它們不存在.所有綁定到該交換機的隊列都會收到消息;
  • 如果交換機的類型是"direct"或者"topic",那麽這個參數才有意義.

mandatory:

  • 當為true時,如果exchange根據自身類型和第2個參數(routeKey)無法找到一個符合條件的queue,那麽會將消息返還給生產者;
  • 當為false時,出現上述情形broker會直接將消息扔掉.

測試:

生產者

技術分享圖片
    public class Producer
    {
        private const string QueueName = "test_queue";
        private const string ExchangeName = "test_exchange";

        public static void Send()
        {         
using (IConnection connection = ConnectionHelper.GetConnection()) using (IModel channel = connection.CreateModel()) { channel.BasicQos(0, 1, false);
channel.BasicReturn += (s, e) => { byte[] bytes = e.Body; string str = Encoding.Default.GetString(bytes); Console.WriteLine("return message : " + str); };

string msg = "hello world "; channel.BasicPublish ( exchange: ExchangeName, routingKey: "找不到匹配的隊列", mandatory: true, basicProperties: null, body: Encoding.Default.GetBytes(msg) ); Console.WriteLine($"send {msg}"); } } }
技術分享圖片

運行結果:

技術分享圖片

basicProperties:消息的基本屬性

該參數是一個 IBasicProperties 類型的對象,具體有哪些屬性,我們可以看源代碼,不過我覺得通過管理後臺來了解這些參數,更直觀一些.

技術分享圖片

實在是有點多啊!

  • content_type 消息內容的類型,如 "application/json"
  • content_encoding 消息內容的編碼格式
  • priority 消息的優先級,上面文章已經講過了.
  • correlation_id 用於將RPC響應與請求相關聯.
  • reply_to 回調隊列
  • expiration 消息過期時間,單位毫秒.該參數值優先級>隊列參數設置中的消息生存期
  • message_id 消息id
  • timestamp 消息的時間戳
  • type: 類型
  • user_id: 用戶id
  • app_id: 應用程序id
  • cluster_id: 集群id

有兩個屬性,persistent 和 DeliveryMode ,它們的作用是一樣的.

Persistent : true 表示消息持久化.當然,前提是隊列也必須持久化.

管理後臺可以直接設置 DeliveryMode :

技術分享圖片

RabbitMQ (十一) 消息的參數詳解