RabbitMQ - 常用訊息佇列之萬用字元模式【Topic Exchange】
阿新 • • 發佈:2021-06-22
介紹
萬用字元模式和路由模式其實差不多,不同於配符模式中的路由可以宣告為模糊查詢.
- 符號 # 匹配一個或多個詞.
- 符號 * 匹配一個詞。
RabbitMQ中萬用字元的萬用字元是用"."來分割字串的.比如a.*只能匹配到a.b,a.c,而a.#可以匹配到a.a.c,a.a.b.
.net 5.0 程式碼實現- 生產者實現
using RabbitMQ.Client; using System; using System.Text; namespace RabbitMQTest.Producer { /// <summary> /// RabbitMQ測試_Producer生產者 /// </summary> class Program { static void Main(string[] args) { // 1、建立連線工廠 IConnectionFactory factory = new ConnectionFactory() { UserName = "admin", Password = "admin", HostName = "192.168.1.101", //rabbitmq server ip Port = 5672, VirtualHost = "testhost" //在此連線期間要訪問的虛擬主機。 預設值[ / ] }; // 2、建立連線 IConnection connection = factory.CreateConnection(); // 3、建立通道 IModel channel = connection.CreateModel(); // 交換機名稱 string exchangeName = "exchangeTest"; string routeKey = "key.a"; // 4、把交換機設定成 Topic 路由模式 channel.ExchangeDeclare(exchangeName, type: ExchangeType.Topic); Console.WriteLine("\n RabbitMQ連線成功,請輸入訊息,輸入exit退出!"); string input; do { input = Console.ReadLine(); byte[] sendBytes = Encoding.UTF8.GetBytes(input); //釋出訊息 channel.BasicPublish(exchangeName, routeKey, null, sendBytes); } while (input.Trim().ToLower() != "exit"); Console.WriteLine("\n RabbitMQ測試完畢!"); // 6、關閉通道 channel.Close(); // 7、關閉連線 connection.Close(); } } }
- 消費者實現
using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Text; using System.Threading; namespace RabbitMQTest.Consumer { /// <summary> /// RabbitMQ測試_Consumer消費者 /// </summary> class Program { static void Main(string[] args) { Console.WriteLine("輸入接受key的名稱"); string routekey = Console.ReadLine(); // 1、建立連線工廠 ConnectionFactory factory = new ConnectionFactory() { UserName = "admin", //使用者名稱 Password = "admin", //密碼 HostName = "192.168.1.101", //rabbitmq server ip Port = 5672, //埠號 VirtualHost = "testhost" //在此連線期間要訪問的虛擬主機。 }; // 2、建立連線 IConnection connection = factory.CreateConnection(); // 3、建立通道 IModel channel = connection.CreateModel(); // 交換機名稱 string exchangeName = "exchangeTest"; // 4、宣告交換機 channel.ExchangeDeclare(exchangeName, ExchangeType.Topic); // 訊息佇列名稱 string queueName = DateTime.Now.Year.ToString(); // 5、宣告佇列 channel.QueueDeclare(queueName, false, false, false, null); // 5.1、將佇列,交換機和key繫結 channel.QueueBind(queueName, exchangeName, routekey, null); // 6、定義消費者 EventingBasicConsumer consumer = new EventingBasicConsumer(channel); Console.WriteLine($"佇列名稱:{queueName}"); // 7、接收到訊息事件 consumer.Received += (ch, ea) => { string message = Encoding.Default.GetString(ea.Body.ToArray()); Console.WriteLine($"接受到訊息:{message}"); // 8、確認該消費已被消費 channel.BasicAck(ea.DeliveryTag, true); }; // 9、啟動消費者 設定為自動應答訊息 channel.BasicConsume( queue: queueName, // 訊息佇列名稱 autoAck: false, // 兩種訊息確認模式false 手動模式 true自動模式 consumer: consumer); Console.WriteLine("消費者1已啟動"); Console.ReadKey(); channel.Close(); connection.Close(); } } }
只有在萬用字元匹配通過的情況下才會接收訊息