使用重试设置与批量运输的间隔 [英] UseRetry set interval with MassTransit

查看:0
本文介绍了使用重试设置与批量运输的间隔的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用具有间隔设置的UseReter,使用MassTransport和Azure Service Bus作为传输。 消费者代码:

    public async Task Consume(ConsumeContext<ISimpleRequest> context)
    {
        _log.InfoFormat("Strated working on {0}", context.Message.CustomerId);
        throw new InvalidOperationException("some error");       
    }

请求服务:

var _busControl = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
        {
            var host =  cfg.Host("...", h =>
            {
            });
            cfg.MaxConcurrentCalls = 10;
            cfg.ReceiveEndpoint(host, "requestconsumerbag",
                e => { e.UseRetry(Retry.Interval(2,TimeSpan.FromMinutes(5))); e.Consumer<RequestConsumer>(); });
            cfg.UseServiceBusMessageScheduler();
        });
         _busControl.Start();
在发送消息后,我希望立即收到一条消息,5分钟后再收到一条,10分钟后再收到一条。但我立即收到一条消息,5分钟后收到两条消息,10分钟后收到三条消息,每隔5分钟再收到三条消息。如果这是错误,我如何编写代码来强制它像我前面所说的那样工作?

推荐答案

长重试周期的问题是您超出了Azure Service Bus的锁定超时。您应该使用邮件重新传递,而不是重试。

UseReter()-是内联重试筛选器。它在来自代理的相同传递内重试相同的消息。它用于处理暂时性故障,如SQL超时或死锁问题。它不适用于长期重试操作。

现在配置有点棘手,在3.4.1中,我不确定是否集成了重试计数(可能没有),但对于每种消息类型,您可以使用计划的可靠。

x.Consumer<MyConsumer>(cfg =>
{
    cfg.ConfigureMessage<MyMessage>(x => x.UseScheduledRedelivery(r => r.Intervals(1000, 2000))
});

这将使用消息计划程序(在Azure中,它将使用EnqueeMessageTimeUtc计划消息)。

在尚未发布的3.5中更清晰。

这篇关于使用重试设置与批量运输的间隔的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆