我正在尝试在基于 Azure 服务总线的非常可靠的基于消息的系统中使用 MassTransit。 当消息处理发生错误时,MassTransit 会将消息移至错误/故障队列。 我知道我可以对消费者的策略进行重试,而且我确实这么做了。我想要配置的是 MassTransit 尝试处理消息,如果发生错误,则放弃消息,以便将其返回到订阅的前面以供其他订阅者接收。
我正在尝试将其与自定义断路器结合使用,当发生处理错误时该断路器会立即中断。
这将增加服务总线上的交付计数,并最终可能导致死信,但我们已经有了基于非公共交通的方法来处理这个问题。
那么有没有办法禁用所有错误队列功能并放弃消息?
您可以使用以下方式配置接收端点:
cfg.ThrowOnSkippedMessages();
cfg.RethrowFaultedMessages();
这会将错误传播回服务总线(订阅或队列),并让 MaxDeliveryCount 最终决定它是否最终进入 DLQ。
如果您正在使用依赖项注入配置 MassTransit,如下所示:
services.AddMassTransit(x =>
x.UsingRabbitMq((context, cfg) => // Instead of RabbitMQ, could be UsingAzureServiceBus or UsingAmazonSQS
// ...
cfg.ConfigureEndpoints(context);
//...
});
那么禁用死信队列的方法是使用消费者定义,如下所示:
public class SubmitOrderConsumerDefinition :
ConsumerDefinition<SubmitOrderConsumer>
{
protected override void ConfigureConsumer(IReceiveEndpointConfigurator endpointConfigurator, IConsumerConfigurator<SubmitOrderConsumer> consumerConfigurator, IRegistrationContext context)
{
endpointConfigurator.DiscardFaultedMessages();
endpointConfigurator.DiscardSkippedMessages();
}
}