RabbitMQ .NET客户端不会立即引发错误

时间:2017-03-06 15:04:25

标签: c# .net rabbitmq rabbitmq-exchange

这是一个使用RabbitMQ.Client版本4.1.1的简单程序:

var message = Encoding.UTF8.GetBytes("test");
var cf = new ConnectionFactory();
using (var conn = cf.CreateConnection())
using (var channel = conn.CreateModel())
{
    int i = 1;
    while (true)
    {
        Console.WriteLine(i++);
        channel.BasicPublish("nonexistent", "", body: message);
    }
}

这里我试图发布到尚未在服务器上声明的交易所。这会导致错误,即404,NOT_FOUND - no exchange 'nonexistent' in vhost '/'被抛出。但是,错误不会立即在第一个BasicPublish调用中抛出,而是随机向下抛出。我在BasicPublish等8次,22次,40次调用之后抛出了它。ModelShutdown事件仅在异常之后被提升,因此它也没有帮助。

问题是,为什么不立即投掷,以便我可以检测错误并采取行动?它表现得好像许多出版物成功,而实际上他们并没有。我该怎么做才能使客户端表现出可预测的行为?感谢。

1 个答案:

答案 0 :(得分:0)

我认为问题可能是BasicPublish返回时不能保证消息是在RabbitMQ服务器上到达的。因此,当您尝试发布到不存在的交易所时,您不能立即获得异常。

我认为你可以尝试两种不同的方法:

  • 在发布之前宣布交换,这样您就不必担心交易所的存在
  • 使用"可靠"发布方法:发布确认或交易(您可以找到更多信息here