【问题标题】:RabbitMQ C# Practical ExampleRabbitMQ C# 实用示例
【发布时间】:2017-08-01 21:01:00
【问题描述】:

我是 RabbitMQ 的新手,我很难找到一个 VS2017 C# 示例,该示例可以打印到控制台。我可以发送和接收消息没有问题,但我想把消息的内容并实际使用它。以下是我的代码:

using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.IO;

namespace MyCode
{
  class Program
  {
    public static void Main()
    {
      var factory = new ConnectionFactory() { HostName = "xxx.xx.x.x", UserName = "MyTest", Password = "MyTest", Port = 5672 };
      using (var connection = factory.CreateConnection())
      {
        using (var channel = connection.CreateModel())
        {

          channel.QueueDeclare(queue: "MyTest", durable: false, exclusive: false, autoDelete: false, arguments: null);

          var consumer = new EventingBasicConsumer(channel);
          consumer.Received += (model, ea) =>
          {
            var body = ea.Body;
            var message = Encoding.UTF8.GetString(body);
            DoSomething(message);
          };

          channel.BasicConsume(queue: "MyTest", autoAck: true, consumer: consumer);
        }
      }
    }
    static void DoSomething(string message)
    {
      File.AppendAllText(@"C:\RMQ.txt", message);
    }
  }
}

问题是,我似乎无法从 Consumer.Received 步骤中得到任何东西。任何帮助将不胜感激!

编辑::

我能够通过使用此代码使其工作:

  var factory = new ConnectionFactory() { HostName = "xxx.xx.x.x", UserName = "MyTest", Password = "MyTest", Port = 5672 };
  using (IConnection connection = factory.CreateConnection())
  {
    using (IModel channel = connection.CreateModel())
    {

      channel.QueueDeclare(queue: "MyTest", durable: false, exclusive: false, autoDelete: false, arguments: null);

      BasicGetResult consumer = channel.BasicGet("MyTest", true);

      if (consumer != null)
      {
        string message = Encoding.UTF8.GetString(consumer.Body);
        DoSomething(message);
      }

    }
  }

有人发现这有什么问题吗?

【问题讨论】:

  • 为什么 DoSomething 不能包含代码来做你想做的事情?
  • 谁发送消息?此外,如果您尝试将断点设置到分配给consumer.Received 的 lambda 主体中,您的执行流程会中断吗?
  • 我想让 DoSomething 做我想要的代码。问题是代码永远不会到达那里。代码将在 lambda 语句(整个事情)上中断,但随后会跳到 using 的末尾,而不是进入 DoSomething。

标签: c# rabbitmq visual-studio-2017


【解决方案1】:

您的第一段代码的问题是您的程序在处理任何消息之前就完成了执行。 EventingBasedConsumer 是异步的,实际上不会阻止您的程序退出。您需要实现某种等待才能实际处理消息。尝试在Channel.BasicConsume 之后添加Thread.Sleep(10000); 并检查是否有任何消息正在处理。

【讨论】:

  • 假设如何继续侦听 Web 应用程序中的事件?
【解决方案2】:

对于尝试设置读取的启动后忘记应用程序,请尽量不要对您的连接和通道使用“使用”语句。一旦子例程完成执行,它们将超出范围(设置为垃圾收集)。

显然,您需要启动并运行控制台应用程序才能接收消息。所以,我确实在调用应用程序中放置了一个 Console.Readline() 以防止线程退出。

【讨论】:

    猜你喜欢
    • 2015-04-15
    • 2014-01-24
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多