如何强制 MassTransit 更新现有 AWS SQS 队列的队列设置?

How to force MassTransit to update queue settings for exisitng AWS SQS queues?

我正在尝试使用新设置更新我们现有的消费者 SQS 队列。在这种情况下,我们需要将所有队列 TTL 更改为最长 14 天(对于正常队列、错误队列和 DLQ 队列)。

经过大量搜索后,我发现了一个似乎可以做到这一点的代码:

cfg.QueueAttributes.Add(QueueAttributeName.MessageRetentionPeriod, 1209600);
cfg.SendTopology.ConfigureErrorSettings = settings => settings.QueueAttributes.Add(QueueAttributeName.MessageRetentionPeriod, 1209600);
cfg.SendTopology.ConfigureDeadLetterSettings = settings => settings.QueueAttributes.Add(QueueAttributeName.MessageRetentionPeriod, 1209600);

然而,当针对现有队列构建时,它似乎没有更新设置。

这是我的完整 MassTransit 设置:

services.AddMassTransit(x =>
{
    x.AddAmazonSqsMessageScheduler();
    x.AddConsumers(assembliesWithConsumers.ToArray());
    x.UsingAmazonSqs((context, cfg) =>
    {
        cfg.UseAmazonSqsMessageScheduler();

        cfg.Host("aws", h =>
        {
            if (!String.IsNullOrWhiteSpace(mtSettings.AccessKey))
            {
                h.AccessKey(mtSettings.AccessKey);
            }

            if (!String.IsNullOrWhiteSpace(mtSettings.SecretKey))
            {
                h.SecretKey(mtSettings.SecretKey);
            }

            h.Scope($"{mtSettings.Prefix}-{mtSettings.Environment}", true);
            var sqsConfig = !String.IsNullOrWhiteSpace(mtSettings.SqsServiceUrl)
                ? new AmazonSQSConfig() { ServiceURL = mtSettings.SqsServiceUrl }
                : new AmazonSQSConfig()
                    { RegionEndpoint = RegionEndpoint.GetBySystemName(mtSettings.Region) };

            h.Config(sqsConfig);

            var snsConfig = !String.IsNullOrWhiteSpace(mtSettings.SnsServiceUrl)
                ? new AmazonSimpleNotificationServiceConfig()
                    { ServiceURL = mtSettings.SnsServiceUrl }
                : new AmazonSimpleNotificationServiceConfig()
                    { RegionEndpoint = RegionEndpoint.GetBySystemName(mtSettings.Region) };

            h.Config(snsConfig);
        });

        cfg.QueueAttributes.Add(QueueAttributeName.MessageRetentionPeriod, 1209600);
        cfg.SendTopology.ConfigureErrorSettings = settings => settings.QueueAttributes.Add(QueueAttributeName.MessageRetentionPeriod, 1209600);
        cfg.SendTopology.ConfigureDeadLetterSettings = settings => settings.QueueAttributes.Add(QueueAttributeName.MessageRetentionPeriod, 1209600);

        cfg.ConfigureEndpoints(context, new BusEnvironmentNameFormatter(mtSettings.Environment));
    });
});

有谁知道如何使用 MassTransit 强制更新 SQS 队列设置?

MassTransit 不会更新现有队列或主题的设置。应用设置的唯一方法是删除队列或主题,之后 MassTransit 将使用配置的设置重新创建它。