Rabbitmq 如何在MassTransit中配置多个重试策略

Rabbitmq 如何在MassTransit中配置多个重试策略,rabbitmq,masstransit,Rabbitmq,Masstransit,我需要针对特定消费者的两个单独的重试策略。一个用于HttpRequestException和SocketException,另一个用于自定义DatabaseException和未处理的SqlException。我之所以要这样做,是因为我希望这两种方法都有单独的指数重试间隔 我有以下配置: cfg.ReceiveEndpoint( host, "ExampleQueueName", ec => { ec.Consumer<ExampleC

我需要针对特定消费者的两个单独的重试策略。一个用于
HttpRequestException
SocketException
,另一个用于自定义
DatabaseException
和未处理的
SqlException
。我之所以要这样做,是因为我希望这两种方法都有单独的指数重试间隔

我有以下配置:

cfg.ReceiveEndpoint(
    host,
    "ExampleQueueName",
    ec =>
    {
        ec.Consumer<ExampleConsumer>(context);
        ec.EnablePriority(5);
        ec.UseRetry(retryConfig =>
        {
            // exponential backup in minutes
            retryConfig.Intervals(new[] { 1, 2, 4, 8, 16, 32 }.Select(t => TimeSpan.FromSeconds(t)).ToArray());
            retryConfig.Handle<HttpRequestException>(x => x.IsTransient());
            retryConfig.Handle<SocketException>(x => x.IsTransient());
        });
        ec.UseRetry(retryConfig =>
        {
            // exponential backup in seconds
            retryConfig.Intervals(new[] { 1, 2, 4, 8, 16, 32 }.Select(t => TimeSpan.FromSeconds(t)).ToArray());
            retryConfig.Handle<DatabaseException>(x => x.IsTransient());
            retryConfig.Handle<SqlException>(x => x.IsTransient());
        });
    });
cfg.ReceiveEndpoint(
主办
“ExampleQueueName”,
ec=>
{
欧共体消费者(上下文);
ec.使能优先权(5);
ec.UseRetry(retryConfig=>
{
//几分钟内完成指数备份
retryConfig.interval(新[]{1,2,4,8,16,32}.Select(t=>TimeSpan.FromSeconds(t)).ToArray());
Handle(x=>x.IsTransient());
Handle(x=>x.IsTransient());
});
ec.UseRetry(retryConfig=>
{
//秒级备份
retryConfig.interval(新[]{1,2,4,8,16,32}.Select(t=>TimeSpan.FromSeconds(t)).ToArray());
Handle(x=>x.IsTransient());
Handle(x=>x.IsTransient());
});
});
目前,仅使用第二个。第一个似乎已被覆盖

我还尝试过这样配置二级重试:

cfg.ReceiveEndpoint(
    host,
    "QueueName",
    ec =>
    {
        ec.Consumer<ExampleConsumer>(context, factory =>
        {
            factory.UseRetry(retryConfig =>
            {
                // exponential backup in seconds for sql and concurrency exceptions
                retryConfig.Intervals(new[] { 1, 2, 4, 8, 16, 32 }.Select(t => TimeSpan.FromSeconds(t)).ToArray());
                retryConfig.Handle<DatabaseException>(x => x.IsTransient());
                retryConfig.Handle<SqlException>(x => x.IsTransient());
            });
        });
        ec.EnablePriority(5);
        ec.UseRetry(retryConfig =>
        {
            // exponential backup in minutes for http request exceptions
            retryConfig.Intervals(new[] { 1, 2, 4, 8, 16, 32 }.Select(t => TimeSpan.FromSeconds(t)).ToArray());
            retryConfig.Handle<DatabaseException>(x => x.IsTransient());
            retryConfig.Handle<SqlException>(x => x.IsTransient());
        });
    });
cfg.ReceiveEndpoint(
主办
“队列名称”,
ec=>
{
ec.消费者(上下文,工厂=>
{
factory.UseRetry(retryConfig=>
{
//sql和并发异常的指数备份(秒)
retryConfig.interval(新[]{1,2,4,8,16,32}.Select(t=>TimeSpan.FromSeconds(t)).ToArray());
Handle(x=>x.IsTransient());
Handle(x=>x.IsTransient());
});
});
ec.使能优先权(5);
ec.UseRetry(retryConfig=>
{
//http请求异常的指数备份(分钟)
retryConfig.interval(新[]{1,2,4,8,16,32}.Select(t=>TimeSpan.FromSeconds(t)).ToArray());
Handle(x=>x.IsTransient());
Handle(x=>x.IsTransient());
});
});

但这似乎也不起作用。有人知道如何为不同的异常类型应用不同的重试间隔吗?

MassTransit将所有内容构建为一个管道,过滤器的顺序很重要。重写上面的示例应该可以解决这个问题(我所做的只是将消费者移到最后)

cfg.ReceiveEndpoint(“ExampleQueueName”,ec=>
{
ec.使能优先权(5);
ec.UseMessageRetry(r=>
{
r、 间隔(新[]{1,2,4,8,16,32}.Select(t=>TimeSpan.FromSeconds(t)).ToArray());
r、 句柄(x=>x.IsTransient());
r、 句柄(x=>x.IsTransient());
});
ec.UseMessageRetry(r=>
{
r、 间隔(新[]{1,2,4,8,16,32}.Select(t=>TimeSpan.FromSeconds(t)).ToArray());
r、 句柄(x=>x.IsTransient());
r、 句柄(x=>x.IsTransient());
});
欧共体消费者(上下文);
});