rabbitmq小記

發topic代碼,創建交換器,數據直接按routingKey發送到交換器中,即不需要定義隊列:    

            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    // 創建交換器
                    channel.ExchangeDeclare("logs3", ExchangeType.Topic);

                    // 發送消息
                    channel.BasicPublish(exchange: "logs3", routingKey: "red.green", basicProperties: null, body: Encoding.UTF8.GetBytes($"測試red.green"));
                    channel.BasicPublish(exchange: "logs3", routingKey: "red.yellow.green", basicProperties: null, body: Encoding.UTF8.GetBytes($"測試red.yellow.green"));
                }
            }

接收topic,需要定義隊列並綁定到交換器,每個隊列中的數據只能被一個消費者獲取,即使兩個消費都同時接收a.#,如果想多個消費者都收到這個消息,則不同消費者需定義不同的隊列:

如果使用了不同的隊列,要注意是否有消息不被消費的情況,造成消息累積永遠沒有人消費

 private void button6_Click(object sender, EventArgs e)
        {
            //接收topic
            string qname = Guid.NewGuid().ToString();  //如果多個消費者定義的隊列名相同,則只能發到一個消費者
            cn接收 = this.factory.CreateConnection();
            mod接收 = cn接收.CreateModel();
            mod接收.QueueDeclare(qname, false, false, true, null);
            mod接收.QueueBind(qname, "logs3", "red.#");
            var consumer = new EventingBasicConsumer(mod接收); 
            mod接收.BasicConsume(qname, true, consumer);   

            //該事件在接收到消息時觸發
            consumer.Received += Consumer_Received3;

        }

        private void Consumer_Received3(object sender, BasicDeliverEventArgs e)
        {

            byte[] body = e.Body.ToArray();   //消息字節數組
            string message = e.RoutingKey + Encoding.UTF8.GetString(body); //消息內容
            sb.AppendLine(message);
        }

 設置消息超時:

  using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    Dictionary<string, object> d = new Dictionary<string, object>();
                    d["x-message-ttl"] = 10 * 1000; //10s超時
                    string qname = this.txt隊列名.Text.Trim();
                    channel.QueueDeclare(qname, false, false, true, d);//創建一個名稱爲hello的消息隊列
                    var properties = channel.CreateBasicProperties();

                    properties.DeliveryMode = 1; //1表示不持久化,2表示持久化(默認)

                    properties.Headers = new Dictionary<string, object>();
                    properties.Headers["文件名"] = "經.mp4";
                    properties.Headers["文件長度"] = "2520";
                    string message = qname + DateTime.Now.ToString(); //傳遞的消息內容
                    var body = Encoding.UTF8.GetBytes(message);
                    channel.BasicPublish("", qname, properties, body); //開始傳遞
                }
            }

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章