Общий проект содержит следующее: < /p>
Код: Выделить всё
public static IServiceCollection AddMassTransitWithRabbitMq(
this IServiceCollection services,
BrokerSettings appSettings,
Action configureEndpoints,
Action? configureJobConsumers = null)
{
services.AddMassTransit(cfg =>
{
var entryAssembly = Assembly.GetEntryAssembly();
cfg.AddConsumers(entryAssembly);
cfg.AddDelayedMessageScheduler();
cfg.SetKebabCaseEndpointNameFormatter();
cfg.SetInMemorySagaRepositoryProvider();
cfg.AddJobSagaStateMachines();
configureJobConsumers?.Invoke(cfg);
cfg.UsingRabbitMq((context, rabbitCfg) =>
{
rabbitCfg.UseDelayedMessageScheduler();
rabbitCfg.PrefetchCount = 10;
rabbitCfg.Exclusive = false;
rabbitCfg.Durable = true;
rabbitCfg.Host(appSettings.HostName, "/", h =>
{
h.Username(appSettings.UserName);
h.Password(appSettings.Password);
h.Heartbeat(600);
});
rabbitCfg.ConfigureEndpoints(context);
});
});
return services;
}
< /code>
В моей службе я называю метод таким: < /p>
services.AddMassTransitWithRabbitMq(appSettings.BrokerSettings, (msContext, cfg) =>
{
cfg.ReceiveEndpoint(QueueNames.GetPropertiesExternal, e =>
{
e.ConfigureConsumer
(msContext);
e.ConnectReceiveEndpointObserver(new GlobalExceptionObserver());
});
},
reg =>
{
reg.AddConsumer(c =>
{
c.Options(o => o
.SetJobTimeout(TimeSpan.FromHours(5))
.SetConcurrentJobLimit(5)) // one long job at a time per instance
.SetRetry(r => r.Interval(3, TimeSpan.FromMinutes(1)));
});
});
< /code>
Мой потребительский класс: < /p>
public class PropertiesAndDefinitionsConsumer(ILogger logger) : IJobConsumer
{
public async Task Run(JobContext context)
{
// Do something.
}
}
< /code>
При вызове я получаю сообщение в своей очереди, но потребитель никогда не попадает. < /p>
return await _publishProvider.SubmitJob(message, cancellationToken);
Подробнее здесь: https://stackoverflow.com/questions/797 ... -never-hit