RabbitMq Routing模式讲解

本文介绍了RabbitMQ的路由模式,对比了与广播模式的区别。在路由模式中,通过设置routingKey,可以实现对消息的过滤和控制。发布者和订阅者都需要设置相同的routingKey来确保消息的精准传递。示例代码展示了如何在C#中使用RabbitMQ进行路由模式的消息发布和接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RabbitMq 路由模式 讲解

前面讲到的 将交换机设置成fanout,进行消息广播的模式,对消息没有任何的控制,是一种简单无脑的模式,没法对消息进行过滤和控制

步骤
1 声明交换机时设置 交换机类型为direct
channel.ExchangeDeclare(exchange: “direct_logs”, type: “direct”);

2 发布消息到交换机时设置 routingKey
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: “direct_logs”,
routingKey: severity,
basicProperties: null,
body: body);

that ‘severity’ can be one of ‘info’, ‘warning’, ‘error’

3 订阅者的也同样的设置相应的routingKey
var queueName = channel.QueueDeclare().QueueName;
foreach(var severity in args)
{
channel.QueueBind(queue: queueName,
exchange: “direct_logs”,
routingKey: severity);
}

发布者代码
using System;using System.Linq;using RabbitMQ.Client;using System.Text;
class EmitLogDirect
{
public static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = “localhost” };
using(var connection = factory.CreateConnection())
using(var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: “direct_logs”,
type: “direct”);

        var severity = (args.Length > 0) ? args[0] : "info";
        var message = (args.Length > 1)
                      ? string.Join(" ", args.Skip( 1 ).ToArray())
                      : "Hello World!";
        var body = Encoding.UTF8.GetBytes(message);
        channel.BasicPublish(exchange: "direct_logs",
                             routingKey: severity,
                             basicProperties: null,
                             body: body);
        Console.WriteLine(" [x] Sent '{0}':'{1}'", severity, message);
    }

    Console.WriteLine(" Press [enter] to exit.");
    Console.ReadLine();
}

}

消费者代码

using System;using RabbitMQ.Client;using RabbitMQ.Client.Events;using System.Text;
class ReceiveLogsDirect
{
public static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = “localhost” };
using(var connection = factory.CreateConnection())
using(var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: “direct_logs”,
type: “direct”);
var queueName = channel.QueueDeclare().QueueName;

        if(args.Length < 1)
        {
            Console.Error.WriteLine("Usage: {0} [info] [warning] [error]",
                                    Environment.GetCommandLineArgs()[0]);
            Console.WriteLine(" Press [enter] to exit.");
            Console.ReadLine();
            Environment.ExitCode = 1;
            return;
        }

        foreach(var severity in args)
        {
            channel.QueueBind(queue: queueName,
                              exchange: "direct_logs",
                              routingKey: severity);
        }

        Console.WriteLine(" [*] Waiting for messages.");

        var consumer = new EventingBasicConsumer(channel);
        consumer.Received += (model, ea) =>
        {
            var body = ea.Body.ToArray();
            var message = Encoding.UTF8.GetString(body);
            var routingKey = ea.RoutingKey;
            Console.WriteLine(" [x] Received '{0}':'{1}'",
                              routingKey, message);
        };
        channel.BasicConsume(queue: queueName,
                             autoAck: true,
                             consumer: consumer);

        Console.WriteLine(" Press [enter] to exit.");
        Console.ReadLine();
    }
}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值