Протестируйте методы Handle и Handle <IFailed>с повторением 1-го уровня и 2-го уровня с Rebus - PullRequest
0 голосов
/ 27 мая 2019

Как отлаживать оба Handle метода ниже?

Я установил точки останова для обоих методов Handle в Visual Studio и отправил сообщение в очередь Subscriber1, но оба метода не вызывались в VS.

public class SomeHandler : IHandleMessages<string>, IHandleMessages<IFailed<string>>
{
    readonly IBus _bus;

    public SomeHandle(IBus bus)
    {
        _bus = bus;
    }

    public async Task Handle(string message)
    {
        // do stuff that can fail here...
    }

    public async Task Handle(IFailed<string> failedMessage)
    {
        await _bus.Advanced.TransportMessage.Defer(TimeSpan.FromSeconds(30));
    }
}

Ниже приведено сообщение, отправленное на Subscriber1.

Я пытался отправить сообщение, исключая rbs2-msg-id или rbs2-msg-type, но ни один из них не вызывает приведенный выше метод Handle.

{
  "body": "Test",
   //other fields
  "properties": {
    "rbs2-intent": "pub",
    "rbs2-msg-id": "cd57d735-3989-45b5-8a3c-e457fa61dc94",
    "rbs2-return-address": "publisher",
    "rbs2-senttime": "2019-05-27T15:07:25.1770000+01:00",
    "rbs2-sender-address": "publisher",
    "rbs2-msg-type": "System.String, mscorlib",
    "rbs2-corr-id": "cd57d735-3989-45b5-8a3c-e457fa61dc94",
    "rbs2-corr-seq": "0",
    "rbs2-content-type": "application/json;charset=utf-8"
  },
  //other fields
}

Обновление 1

Если в Handle(string message) выдается исключение, метод будет повторен на основании количества попыток 1-го уровня. Это то, что нам нужно.

Однако Handle(IFailed<string> failedMessage) не вызывается, как отлаживать Handle(IFailed<string> failedMessage) как abvoe?

Одно примечание : когда в Handle(string message) генерируется исключение, IErrorHandler НЕ вызывается и AddTransportMessageForwarder также не вызывается, верно ли это?

1 Ответ

0 голосов
/ 27 мая 2019

Не могли бы вы попробовать и проверить свои журналы?

Когда вы удаляете заголовок rbs2-msg-id, Rebus немедленно переместит сообщение в очередь недоставленных сообщений, просто отказавшись обработать его.Это связано с тем, что сообщение без идентификатора сообщения не может быть отслежено системой отслеживания ошибок Rebus.

Если вы удалите заголовок rms2-msg-type, сериализатор, скорее всего, выдаст ошибку и не десериализует входящее сообщение.

В обоих случаях ошибка будет выведена на регистратор.

И в обоих случаях тело сообщения (string в этом случае, но это может быть любой тип сообщения ) cannot be constructed from the incoming байт[] , so Rebus cannot dispatch the message as either строка not IFailed`.

Редактировать после Обновление 1 :

Если повторные попытки 2-го уровня не запускаются, скорее всего, потому что выне включили их:

Configure.With(...)
    .(...)
    .Options(o => o.SimpleRetryStrategy(secondLevelRetriesEnabled: true))
    .Start();

IErrorHandler вызывается, когда пришло время переместить сообщение в очередь недоставленных сообщений. Вы должны увидеть, что оно вызывается, когда все попытки доставки не удаются (5обычные попытки доставки + 5 попыток доставки 2-го уровня).

Если вы настроили все так, как я предлагал, AddTransportMessageForwarder используется в другом экземпляре шины, который получает сообщения из очереди error.IErrorHandler был вызван, иНеудачное сообщение было перенаправлено в очередь error, после чего должен быть вызван сервер пересылки транспортных сообщений.

...