【问题标题】:sending and receive the same message with rabbitMQ使用rabbitMQ发送和接收相同的消息
【发布时间】:2016-07-13 19:09:27
【问题描述】:

我一直在阅读有关如何使用 RabbitMQ C# 客户端的教程。我正在尝试向服务器发送一条 hello world 消息并在我端接收它,以便我知道传输成功。 tutorial 为发送和接收类提供了以下类文件定义:

发送.cs

using System;
using RabbitMQ.Client;
using System.Text;

class Send
{
    public static void Main()
    {
        var factory = new ConnectionFactory() { HostName = "localhost" };
        using(var connection = factory.CreateConnection())
        using(var channel = connection.CreateModel())
        {
            channel.QueueDeclare(queue: "hello",
                                 durable: false,
                                 exclusive: false,
                                 autoDelete: false,
                                 arguments: null);

            string message = "Hello World!";
            var body = Encoding.UTF8.GetBytes(message);

            channel.BasicPublish(exchange: "",
                                 routingKey: "hello",
                                 basicProperties: null,
                                 body: body);
            Console.WriteLine(" [x] Sent {0}", message);
        }

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

Receive.cs

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

class Receive
{
    public static void Main()
    {
        var factory = new ConnectionFactory() { HostName = "localhost" };
        using(var connection = factory.CreateConnection())
        using(var channel = connection.CreateModel())
        {
            channel.QueueDeclare(queue: "hello",
                                 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);
                Console.WriteLine(" [x] Received {0}", message);
            };
            channel.BasicConsume(queue: "hello",
                                 noAck: true,
                                 consumer: consumer);

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

当我(在 Visual Studio 中)运行项目时,我收到一个错误,即定义了多个入口点,这是由于两个类都具有 main() 方法这一事实引起的。我尝试指定一个启动项目,以便它知道要使用哪个 main,但我没有看到它的选项。

我不确定应该使用哪个 main,因为这两个文件在本教程中都是故意以这种方式构建的。我对 C# 有点生疏,因为我最近主要使用 C++ 进行编程。

是否假定我应该有一个主文件来实例化两个类?如果没有,项目应该如何构建?

【问题讨论】:

  • 似乎它们应该单独运行。如果你想通过 VS 运行,那么在不同的实例中打开它们,运行 Send,然后 Receive。
  • @VivekChavda 如果我在 VS 中运行它们,你的意思是说它们应该在单独的项目中吗?
  • 是的,它们看起来是独立的项目,因为它们会生成独立的可执行文件。 stackoverflow.com/questions/4775187/…
  • @VivekChavda 我收到错误消息,当我自己运行接收文件时,它无法连接到服务器上的代理。
  • 这是一个单独的问题。我会再发一个帖子,如果你想不出来。我看不到发送方如何连接和运行,而接收方则不能,但我不熟悉 rabbitmq 的工作原理以及您可能遇到的常见问题/解决方案。

标签: c# visual-studio class rabbitmq


【解决方案1】:

发送和接收代码不应该在同一个 C# 项目中。

虽然在示例中没有明确指出,但它们应该是单独的项目和单独的可执行文件。

将 send.cs 和 receive.cs 拆分为各自的项目

先运行发送项目

你会在 rabbitmq 服务器的队列中看到消息

然后运行接收项目

此时,您将看到消息已按预期被消费

【讨论】:

    【解决方案2】:

    免责声明:我不懂 C#。

    首先:这是真正的基本编程。在任何程序中,您不能有两个入口点,否则在某些语言(如 java 和 c++)中称为“主函数”。我不打算进一步详细说明,因为正如我所说,这是非常基本的东西。

    第二:您在问题WORKS中提供的链接上的教程。跟着它读就行了。

    第三:如果你想把它作为一个程序,这里是代码(是的,我知道我不懂 c#,但我会做出一个信念的飞跃):

    using System;
    using System.Text;
    using RabbitMQ.Client;
    using RabbitMQ.Client.Events;
    
    class SendReceive
    {
        public static void Main()
        {
            var factory = new ConnectionFactory() { HostName = "localhost" };
            using(var connection = factory.CreateConnection())
            using(var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: "hello",
                                     durable: false,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);
    
                string message = "Hello World!";
                var body = Encoding.UTF8.GetBytes(message);
    
                 var consumer = new EventingBasicConsumer(channel);
                consumer.Received += (model, ea) =>
                {
                    var body = ea.Body;
                    var message = Encoding.UTF8.GetString(body);
                    Console.WriteLine(" [x] Received {0}", message);
                };
    
                channel.BasicPublish(exchange: "",
                                     routingKey: "hello",
                                     basicProperties: null,
                                     body: body);
                Console.WriteLine(" [x] Sent {0}", message);
    
                channel.BasicConsume(queue: "hello",
                noAck: true,
                consumer: consumer);
    
            }
            Console.WriteLine(" Press [enter] to exit.");
            Console.ReadLine();
        }
    }
    

    补充:您在评论中提到在某些情况下无法连接,就像@VivekChavda 所说的那样,这是另一个问题。

    【讨论】:

      猜你喜欢
      • 2011-07-23
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 2011-03-09
      • 1970-01-01
      相关资源
      最近更新 更多