是否有一种简单的方法来订阅EasyNetQ中的默认错误队列?

Mik*_*ain 6 rabbitmq easynetq

在我的测试应用程序中,我可以看到处理过的异常消息被自动插入到默认的EasyNetQ_Default_Error_Queue中,这很棒.然后,我可以使用Hosepipe成功地转储或重新排队这些消息,这也很好,但需要下降到命令行并调用Hosepipe和RabbitMQ API来清除重试消息的队列.

所以我认为我的应用程序最简单的方法就是简单地订阅错误队列,这样我就可以使用相同的基础架构重新处理它们.但在EastNetQ中,错误队列似乎很特殊.我们需要使用正确的类型和路由ID进行订阅,因此我不确定错误队列的这些值应该是什么:

bus.Subscribe<WhatShouldThisBe>("and-this", ReprocessErrorMessage);

我可以使用简单的API订阅错误队列,还是需要深入了解高级API

如果我的原始消息的类型是TestMessage,那么我希望能够做这样的事情:

bus.Subscribe<ErrorMessage<TestMessage>>("???", ReprocessErrorMessage);

哪个ErrorMessage是EasyNetQ提供的类来包装所有错误.这可能吗?

Mik*_*low 3

您不能使用简单的 API 来订阅错误队列,因为它不遵循 EasyNetQ 队列类型命名约定 - 也许这是应该修复的问题;)

但高级 API 工作正常。您不会收到原始消息,但很容易获得 JSON 表示形式,您可以轻松地自行反序列化(使用 Newtonsoft.JSON)。以下是您的订阅代码的示例:

[Test]
[Explicit("Requires a RabbitMQ server on localhost")]
public void Should_be_able_to_subscribe_to_error_messages()
{
    var errorQueueName = new Conventions().ErrorQueueNamingConvention();
    var queue = Queue.DeclareDurable(errorQueueName);
    var autoResetEvent = new AutoResetEvent(false);

    bus.Advanced.Subscribe<SystemMessages.Error>(queue, (message, info) =>
    {
        var error = message.Body;

        Console.Out.WriteLine("error.DateTime = {0}", error.DateTime);
        Console.Out.WriteLine("error.Exception = {0}", error.Exception);
        Console.Out.WriteLine("error.Message = {0}", error.Message);
        Console.Out.WriteLine("error.RoutingKey = {0}", error.RoutingKey);

        autoResetEvent.Set();
        return Task.Factory.StartNew(() => { });
    });

    autoResetEvent.WaitOne(1000);
}
Run Code Online (Sandbox Code Playgroud)

在此之前,我必须修复在 EasyNetQ 中编写代码的错误消息中的一个小错误,因此请在尝试之前获取 >= 0.9.2.73 的版本。您可以在此处查看代码示例