.netcore3.1 RabbitMq Topics交换机 电脑版发表于:2021/1/26 15:52 ![](https://img.tnblog.net/arcimg/hb/585b0f1ffa7f4c2095baa20c175b32a0.png) >#.netcore3.1 RabbitMq Topics交换机 [TOC] Topic Exchange介绍 ------------ tn>发送到`topic`交换机的消息不能具有任意的 `routing_key` -它必须是单词列表,以点分隔。这些词可以是任何东西,但通常它们指定与消息相关的某些功能。一些有效的路由关键示例。一些有效的路由关键示例:`stock.usd.nyse `,`nyse.vmw`,`quick.orange.rabbit`。路由关键字中可以包含任意多个单词,最多255个字节。 | | | | ------------ | ------------ | | * (星号) | 可以代替一个单词。 | | # (哈希) | 可以替代零个或多个单词。 | tn>我们用一个简单的例子来做解释: ![](https://img.tnblog.net/arcimg/hb/b342672ebba049e399d34cce5fc391c0.png) tn>在此示例中,我们将发送所有描述地址的消息。将使用包含三个词(两个点)的路由密钥发送消息。路由键中的第一个单词将描述市名,第二个是区域名,第三个是地点名:`<市名>.<区域名>.<地点名>`。<br/> 我们创建了三个绑定:`匹配区域队列`与绑定键`*.南岸区.*`绑定,`匹配市名和地点队列`与`*.*.弹子石`和`重庆市.#`绑定。<br/> 大概我会列举几个消息然后会进入队列的消息如下所示: ![](https://img.tnblog.net/arcimg/hb/bfe5754fe4f64aa0be10e8adbf17e682.png) Topic Exchange创建 ------------ ```csharp var factory = new ConnectionFactory() { HostName = "47.98.187.188", UserName = "bob", Password = "bob" }; // 创建一个链接 using (var connection = factory.CreateConnection()) { // 创建一个通道 using (var channel = connection.CreateModel()) { channel.ExchangeDeclare(exchange: "MyTopicExchange", ExchangeType.Topic, true, false); var routingKey = (args.Length > 0) ? args[0] : "重庆市.南岸区.弹子石"; var message = (args.Length > 1) ? string.Join(" ", args.Skip(1).ToArray()) : "Hello World!"; var body = Encoding.UTF8.GetBytes(message); var properties = channel.CreateBasicProperties(); properties.Persistent = true; channel.BasicPublish(exchange: "MyTopicExchange", routingKey, properties, body); Console.WriteLine(" [x] Sent '{0}':'{1}'", routingKey, message); } } ``` Topic 队列的创建与消费 ------------ ```csharp var factory = new ConnectionFactory() { HostName = "47.98.187.188", UserName = "bob", Password = "bob" }; Console.WriteLine("Please enter a queue name:"); // MyTopicExchange1 MyTopicExchange2 string queuename = Console.ReadLine(); // 创建一个链接 using (var connection = factory.CreateConnection()) { // 创建一个通道 using (var channel = connection.CreateModel()) { channel.ExchangeDeclare(queuename, ExchangeType.Topic, true, false); // 声明一个队列 channel.QueueDeclare( queue: queuename, durable: true, exclusive: false, autoDelete: false, arguments: null); foreach (var bindingKey in args) { // 绑定队列相关正则匹配 channel.QueueBind(queuename, "MyTopicExchange", bindingKey); } // 创建消费实例 var consumer = new EventingBasicConsumer(channel); // 事件在交付到使用者时触发。(消费处理事件) consumer.Received += (model, ea) => { string EventQueueName = queuename; var body = ea.Body.ToArray(); var message = Encoding.UTF8.GetString(body); Console.WriteLine($" RountingKey: {ea.RoutingKey} Queue:{EventQueueName} Message: {message}"); // 手动确认 channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: true); }; // 绑定到队列中去 channel.BasicConsume(queue: queuename, autoAck: false, consumer: consumer); Console.ReadLine(); } } ``` 运行结果 ------------ ![](https://img.tnblog.net/arcimg/hb/c101aeb6595a493aa02f1f4431f4eb0d.png)