我正在尝试将消息发送到 Azure 服务总线队列。我希望 MassTransit 在连接失败时重试递送。
我的消息发送实用程序:
public class MessageSender : IMessageSender
{
private readonly IServiceBus _serviceBus;
public MessageSender(IServiceBus serviceBus)
{
_serviceBus = serviceBus;
}
public async Task SendMessageAsync(IMessage message)
{
await _serviceBus.Send(message);
}
}
我在另一个类中设置了 MassTransit 配置,该类被注入(inject)到消息发送器实用程序中。
public class MassTransitAzureServiceBus : IServiceBus
{
private IBusControl _busControl;
public MassTransitAzureServiceBus()
{
_busControl = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
cfg.Host(new Uri(serviceBusUri), h =>
{
h.NamedKeyCredential = new AzureNamedKeyCredential("name","key");
h.RetryLimit = 8; // this is not being honored
});
});
}
}
然后我发送这样的消息:
public async Task Send<TMessage>(TMessage message) where TMessage : IMessage
{
var sendEndpoint = await _busControl.GetSendEndpoint(new Uri("queue-uri"));
await sendEndpoint.Send(message, typeof(TMessage));
}
我故意断开互联网连接或为服务总线提供错误的连接字符串作为交付失败测试。
它重试 4 次,然后抛出错误,忽略我设置的重试限制。
尝试 4 次后重试失败。可以在 ClientOptions.Retry 中调整重试设置。 (不知道这样的主机。(myhost.servicebus.windows.net:443)) (不知道这样的主机。(myhost.servicebus.windows.net:443)) (不知道这样的主机。(myhost.servicebus. windows.net:443)) (不知道这样的主机。(myhost.servicebus.windows.net:443))
我也尝试过以下方法,但不起作用。
_busControl = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
cfg.UseMessageRetry(x =>
{
x.Immediate(2); // this is not being honored either
});
cfg.Host(new Uri(serviceBusUri), h =>
{
h.NamedKeyCredential = new AzureNamedKeyCredential("name","key");
});
});
有没有办法在不使用 Polly 等服务的情况下重试消息传递?我以前使用 Polly 进行重试,以为可以通过使用 MassTransit 内置的重试机制来摆脱它。
最佳答案
首先,UseMessageRetry
用于消费消息 - 它与发送或发布消息完全无关。
第二,MassTransit will retry该重试配置中显示的任何异常类型呈指数级增长,最多可达 1000 次,包括发布/发送。
第三,你没有启动公共(public)汽车。总线应该在启动时创建并启动。当进程关闭时,总线应该停止。
关于azureservicebus - MassTransit - 配置 Azure 服务总线消息传递重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74850054/