c# - Rabbitmq 扇出交换 C#

标签 c# .net rabbitmq publish-subscribe

我有一个关于Rabitmq扇出交换的问题,我的问题是我想用rabbitmq和c#发布订阅示例。所以我创建了2个项目,其中一个是Publisher,就是这样

static void Main(string[] args)
{
      try
      {
          var factory = new ConnectionFactory() { HostName = "localhost" };
          using (var connection = factory.CreateConnection())
              using (var channel = connection.CreateModel())
              {
                  channel.ExchangeDeclare("example.exchange", ExchangeType.Fanout, true, false, null);
                  var message = GetMessage(args);
                  var body = Encoding.UTF8.GetBytes(message);
                  channel.BasicPublish(exchange: "example.exchange", routingKey: "", basicProperties: null, body: body);
                  Console.WriteLine(" [x] Sent {0}", message);
              }
        }
        catch (Exception ex)
        {
            Console.Write($"bir hata oluştu{ex.Message}");
        }
}

private static string GetMessage(string[] args)
{
    return ((args.Length > 0)
           ? string.Join(" ", args)
           : "info: Hello World!");
}

我有一个消费者,它是

    static void Main(string[] args)
    {
        var factory = new ConnectionFactory() { HostName = "localhost" };
        using (var connection = factory.CreateConnection())
        using (var channel = connection.CreateModel())
        {
            channel.ExchangeDeclare(exchange: "example.exchange", 
            type:"fanout",durable:true);

            var queueName = channel.QueueDeclare().QueueName;
            channel.QueueBind(queue: queueName, exchange: "foo.exchange", 
            routingKey: "");

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

            Console.ReadLine();
        }
    }

但是我收不到消息。为什么会这样?

最佳答案

所以我发现了你的问题。首先,您的消费者中的交换声明是错误的。

您在发布商中将 Exchange 声明为“example.exchange”:

channel.ExchangeDeclare("example.exchange", ExchangeType.Fanout, true, false, null);

但是您的消费者中的“foo.exchange”:

channel.QueueBind(queue: queueName, exchange: "foo.exchange", routingKey: "");

将“foo.exchange”更改为“example.exchange”。

对于您的消费者,我可以使用以下几行消费消息:

public static void Main(string[] args)
{
    ConnectionFactory factory = new ConnectionFactory();
    factory.UserName = "guest";
    factory.Password = "guest";
    factory.HostName = "localhost";
    factory.VirtualHost = "/";

    var connection = factory.CreateConnection();
    var channel = connection.CreateModel();

    var queueName = "test-queue";
    channel.QueueDeclare(queueName, false, false, false, null);
    channel.QueueBind(queueName, "example.exchange", "", null);

    var consumer = new EventingBasicConsumer(channel);
    consumer.Received += (model, ea) =>
    {
        var bodyy = ea.Body;
        var messagee = Encoding.UTF8.GetString(bodyy);
        Console.WriteLine("received [x] {0}", messagee);
    };
    channel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer);

    Console.ReadLine();
}

关于c# - Rabbitmq 扇出交换 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51964937/

相关文章:

c# - 服务已经存在(当它显然不存在时)

c# - 使用 WCF 实现观察者模式

java - 与 ExecutorService 同时使用消息

c# - 使用代码默认值对集合属性进行 XML 反序列化

c# - 使用 C# 版本的 Quicktime 读取时间码轨道数据

c# - MVC - 验证 - ViewModel 是否应该有权访问数据库

python - 使用 RabbitMQ 接收消息然后处理它然后发回结果

c# - 多个并发请求之间的 token 共享 C#

.net - Elasticsearch和SQL Server进行全文搜索?

database - RabbitMQ 内存使用