MassTransit - знать, когда IConsumeObserver.ConsumeFault вызывается или повторяется - PullRequest
0 голосов
/ 02 ноября 2018

Мы используем MassTransit's IConsumeObserver, чтобы отметить ошибки при потреблении. Это вместо службы, потребляющей все Fault события, потому что мы используем служебную шину Azure, а эта не поддерживает полиморфный обмен сообщениями

Поскольку у нас настроены повторные попытки, мы заметили, что блок ConsumeFault<T>() вводится в каждую повторную попытку.

Мы ищем способ определить, находимся ли мы в повторной попытке или нет; введите GetRetryAttempt().
Пример нашего использования:

public virtual async Task ConsumeFault<T>(ConsumeContext<T> context, Exception exception) where T : class
{
        if (context.GetRetryAttempt() <= 0)
        {
            await NotifyFault());
        }
}

Мы заметили (ха, ха), что GetRetryAttempt() всегда равен 0, как также указывалось в комментарии к аналогичному вопросу

Есть ли другой способ определить, когда мы больше не повторяем попытку? Или другой способ предпринять какие-либо действия, если повторные попытки были исчерпаны?

1 Ответ

0 голосов
/ 08 февраля 2019

Как указал Крис Паттерсон здесь

Необходимо учитывать следующее

  1. .UseMessageRetry () должен быть в конфигураторе конечной точки (ec), а не в конфигураторе шины.
  2. UseMessageRetry также должно быть до строки конфигурации потребителя.

например:

Bus.Factory.CreateUsingAzureServiceBus(
                sbc =>
                {
                    var host = ConfigureServiceBus(servicePath, sbc);
                    sbc.SubscriptionEndpoint<T>(host, subscriptionName, ec =>
                    {
                        ec.UseMessageRetry(x => x.Interval(int.Parse(ConfigurationManager.AppSettings[RetryConfigConstants.ServiceBusRetryCount]), TimeSpan.FromMilliseconds(double.Parse(ConfigurationManager.AppSettings[RetryConfigConstants.ServiceBusRetryInterval]))));
                        ec.Consumer<EventConsumer<T>>(context);
                        if (timeToLive != default(TimeSpan))
                        {
                            ec.AutoDeleteOnIdle = timeToLive;
                        }                           
                    });
                })

Наконец, я обнаружил ошибку в своем собственном коде с регистрацией потребителя в. 1016 * autofac . Мой экземпляр IBus был зарегистрирован в SingleInstance, в отличие от InstancePerLifetimeScope (именно так были зарегистрированы мой подписчик и наблюдатель)

...