使用重试设置与批量运输的间隔间隔、批量、重试

由网友(旧街浪人)分享简介:我正在尝试使用具有间隔设置的UseReter,使用MassTransport和Azure Service Bus作为传输。消费者代码:public async Task Consume(ConsumeContext context){_log.InfoFormat("Strated w...

我正在尝试使用具有间隔设置的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中更清晰。

阅读全文

相关推荐

最新文章