【问题标题】:Issue with RabbitMQ when using Multithreading: None of the specified endpoints were reachable使用多线程时 RabbitMQ 的问题:没有一个指定的端点是可达的
【发布时间】:2015-02-14 13:36:16
【问题描述】:

我正在使用 RabbitMQ,需要向队列发送一些消息。 因此,如果我只发送一条消息,它就可以正常工作。 但是如果我同时发送大量消息,我需要测试它是如何工作的,所以我创建了一个使用多线程发送消息的简单应用程序。 发送消息的函数和我只发送一条消息的情况完全一样,唯一的区别是现在我在Task中调用了这个函数。 一旦我运行我的应用程序,我就会收到错误消息。它说:附加信息:没有一个指定的端点是可达的 在行中:使用 (var connection = factory.CreateConnection())

这些是我发送消息的初始行:

var factory = new ConnectionFactory() { 
HostName = Constants.RabbitQueueHostName ,
Port = AmqpTcpEndpoint.UseDefaultPort
};

using (var connection = factory.CreateConnection()){
using (var channel = connection.CreateModel()){
...

所以这有点奇怪。通常我使用 MSMQ 并且从未遇到过 MSMQ 的此类问题。 请指教。

【问题讨论】:

    标签: c# .net multithreading task-parallel-library rabbitmq


    【解决方案1】:

    您是否尝试过不使用 using 语句作为实验?

    另见:

    http://www.rabbitmq.com/javadoc/com/rabbitmq/client/Channel.html

    通道实例可以安全地被多个线程使用。对 Channel 的请求是序列化的,一次只有一个线程运行命令。因此,应用程序可能更喜欢每个线程使用一个 Channel,而不是在多个线程之间共享同一个 Channel。一个重要的警告是,当在多个线程之间共享 Channel 时,确认没有正确处理。因此,在这种情况下,确保 Channel 实例不会被多个线程同时访问非常重要。

    http://architects.dzone.com/articles/rabbitmq-amqp-channel-best

    通道不是线程安全的。您应该在单个线程上创建和使用通道。在混合使用服务器和客户端发起的方法时,您应该特别小心。在交付处理程序中调用发布就是一个示例。

    【讨论】:

      猜你喜欢
      • 2015-10-04
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 2018-05-31
      • 2015-12-02
      • 1970-01-01
      相关资源
      最近更新 更多