發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); //開始傳遞 } }