MassTransit - 知道什么时候被称为重试或退出IConsumeObserver.ConsumeFault

问题描述 投票:0回答:1

我们使用MassTransit的IConsumeObserver要注意消费故障。这是代替消耗所有Fault事件服务的,因为我们使用了Azure的服务总线,这doesn't support polymorphic messaging

正如我们已经有了配置重试,我们已经注意到,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,如在comment on a similar question也指出,

有另一种方式来确定何时我们不再重试?还是另辟蹊径,走当且仅当重一些行动已经用尽?

azureservicebus masstransit
1个回答
0
投票

正如克里斯·帕特森here指出

下面需要考虑到

  1. 该.UseMessageRetry()需要在端点配置器(EC),而不是总线配置器。
  2. UseMessageRetry也需要消费者的配置前行。

e.g:

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;
                        }                           
                    });
                })

最后,我在autofac我自己的代码w.r.t消费者登记发现的错误。我的下iBus实例是使用SingleInstance注册,而不是InstancePerLifetimeScope(这是我的用户和观察者如何进行注册)

© www.soinside.com 2019 - 2024. All rights reserved.