【发布时间】:2020-10-05 21:32:34
【问题描述】:
我在 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.UseRetry(e => Retry.Immediate(3));当我配置 MassTransit 时
但在这种情况下,de 配置保持无限循环
我尝试使用这个:
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));
}
我把这段代码放在 MassTransitConfiguration 中:
rabbitMqConfig.UseDelayedExchangeMessageScheduler();
在最后一种情况下,我得到了重试,但我从来没有得到重试的数量,所以我无法控制它。我也尝试通过标题和其他属性来获得这个数量,但我总是得到 0。
谁能帮帮我?!
【问题讨论】:
-
我会将
ConfigureEndpointslast 放在您的配置中,然后将Host放在首位。管道是有序的,所以一定要按顺序添加你的过滤器等。重试是在内存中的,你不应该调用 redeliver 或者尝试自己重试。文档中有您尝试执行的所有操作的示例。 -
非常感谢@ChrisPatterson!您能否将显示此特定案例的文档链接发送给我(类似于通过程序集添加消费者并以通用方式配置所有内容)?
标签: c# .net rabbitmq queue masstransit