C# MassTransit和RabbitMq没有';出现错误时,请不要重试

C# MassTransit和RabbitMq没有';出现错误时,请不要重试,c#,.net,rabbitmq,queue,masstransit,C#,.net,Rabbitmq,Queue,Masstransit,我对MassTransit和rabbitmq的重试有问题 我已获得代码配置: private static void ConfigureMassTransitWithRabbitMq(this IServiceCollection services, string host, string username, string pwd, string cluster, Assembly assembly) { services.AddMa

我对MassTransit和rabbitmq的重试有问题

我已获得代码配置:

        private static void ConfigureMassTransitWithRabbitMq(this IServiceCollection services, string host, string username, string pwd, string cluster, Assembly assembly)
        {   
            services.AddMassTransit(config =>
            {
                config.AddConsumers(assembly);

                config.SetKebabCaseEndpointNameFormatter();

                config.UsingRabbitMq((context, rabbitMqConfig) =>
                {   
                    rabbitMqConfig.UseRetry(e => Retry.Immediate(3));
                    rabbitMqConfig.ConfigureEndpoints(context);
                    rabbitMqConfig.ConfigurePublish(pipe => 
                    { 
                        pipe.UseExecute(context1 => 
                        { 
                            if (context1.CorrelationId == null) 
                            { 
                                context1.CorrelationId = Guid.NewGuid(); 
                            } 
                        }); 
                    });

                    rabbitMqConfig.Host(new Uri(host), hst =>
                    {
                        hst.Username(username);
                        hst.Password(pwd);
                        hst.PublisherConfirmation = true;
                        hst.Heartbeat(5);
                        hst.UseCluster(c =>
                        {
                            var clusters = cluster?.Split(';');

                            if (cluster == null || clusters.Length == 0)
                                return;

                            foreach (var item in clusters)
                                c.Node(item);
                        });
                    });

                    rabbitMqConfig.ManagementEndpoint((conf) =>
                    {
                        conf.ConfigurePublish((p) =>
                        {
                            p.UseRetry((r) =>
                            {
                                r.Exponential(3, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(5));
                            });
                        });
                    });
                });
            });

            services.AddMassTransitHostedService();
        }
rabbitMqConfig.UseDelayedExchangeMessageScheduler();
我通过组装添加我的消费者

我只是尝试使用:

  • rabbitMqConfig.UseRetry(e=>Retry.Immediate(3))配置MassTransit时
但在这种情况下,反配置仍然是一个无限循环


我试着用这个:

        try
        {
            var order = _mapper.Map<object>(context.Message);
            await Execute(order);
            await context.ConsumeCompleted;
        }
        catch (Exception)
        {
            var retry = context.GetRetryCount();
           
            if (maxAttempts > 3)
            {
                throw;
            }

            await context.Redeliver(TimeSpan.FromSeconds(5));
        }

在上一个例子中,我得到了重试次数,但我从未得到重试次数,因此我无法控制它。我也尝试通过标题和其他属性获取此金额,但我始终得到0


谁能帮帮我

您的配置顺序错误,根据以上示例更正的配置如下所示:

private static void ConfigureMassTransitWithRabbitMq(this IServiceCollection services, string host, string username, string pwd, string cluster, Assembly assembly)
{   
    services.AddMassTransit(config =>
    {
        config.AddConsumers(assembly);

        config.SetKebabCaseEndpointNameFormatter();

        config.UsingRabbitMq((context, rabbitMqConfig) =>
        {   
            rabbitMqConfig.Host(new Uri(host), hst =>
            {
                hst.Username(username);
                hst.Password(pwd);
                hst.Heartbeat(5);
                hst.UseCluster(c =>
                {
                    var clusters = cluster?.Split(';');

                    if (cluster == null || clusters.Length == 0)
                        return;

                    foreach (var item in clusters)
                        c.Node(item);
                });
            });

            rabbitMqConfig.ConfigurePublish(pipe => 
            { 
                pipe.UseExecute(context1 => 
                { 
                    context1.CorrelationId ??= Guid.NewGuid(); 
                }); 
            });

            rabbitMqConfig.UseRetry(e => Retry.Immediate(3));

            rabbitMqConfig.ConfigureEndpoints(context);
        });
    });
    services.AddMassTransitHostedService();
}
我还删除了任何不需要的内容,要么是因为它是默认行为,要么是未使用的


我将
ConfigureEndpoints
放在配置的最后一个,而
Host
放在第一个。管道已订购,因此请确保按顺序添加过滤器等。重试在内存中,您不应该调用redeliver,也不应该尝试自己重试。文档中有您尝试执行的所有操作的示例。非常感谢@ChrisPatterson!您能给我发送一个文档链接来显示这个特定的案例吗(类似于通过程序集添加使用者并以通用方式配置所有使用者)?