MassTransit RabbitMQ AspNetCore не запускает шину и не регистрирует конечные точки приема - PullRequest
2 голосов
/ 26 апреля 2019

Я боролся с этим уже несколько часов, но, похоже, я не могу заставить его работать, несмотря на то, что я, похоже, копирую документацию.

Я использую новый пакет MassTransit AspNetCore для регистрации моей шины и потребителя, но, похоже, она не запускает шину! Если я добавляю точку останова с помощью кода, то регистрирует конечную точку получения, она никогда не получает попадание (но часть AddBus делает), и обмен / очередь не создаются.

Стоит отметить, что это всего лишь веб-API, работающий в IIS, и что существуют также обычные конечные точки отдыха (я не знаю, имеет ли это значение или нет).

Мой код выглядит следующим образом:

services.AddMassTransit(x =>
{
    x.AddConsumer<SelectAllAccessibleConsumer>();

    x.AddBus(provider => Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        var host = cfg.Host(new Uri(rabbitMqMessageBus.Host), rabbitMqMessageBus.Username,
            hostConfigurator =>
            {
                hostConfigurator.Username(rabbitMqMessageBus.Username);
                hostConfigurator.Password(rabbitMqMessageBus.Password);

                if (rabbitMqMessageBus.UseSsl)
                {
                    hostConfigurator.UseSsl(s => { s.Protocol = SslProtocols.Tls12; });
                }
            });

        cfg.ReceiveEndpoint(host, "queue-name", ep =>
        {
            ep.PrefetchCount = 16;
            ep.UseMessageRetry(r => r.Interval(2, 100));
            ep.ConfigureConsumer<SelectAllAccessibleConsumer>(provider);
        });
    }));
});

Я не могу помочь, но чувствую, что упускаю что-то невероятно очевидное, но я не могу этого понять.

1 Ответ

3 голосов
/ 26 апреля 2019

Вы должны фактически запустить шину, что в вашем сценарии должно быть сделано, используя размещенный сервис. Вы можете увидеть образец здесь:

https://github.com/MassTransit/Sample-ConsoleService/blob/master/SampleService/MassTransitConsoleHostedService.cs

public class MassTransitConsoleHostedService :
    IHostedService
{
    readonly IBusControl _bus;

    public MassTransitConsoleHostedService(IBusControl bus, ILoggerFactory loggerFactory)
    {
        _bus = bus;

        if (loggerFactory != null && MassTransit.Logging.Logger.Current.GetType() == typeof(TraceLogger))
            MassTransit.ExtensionsLoggingIntegration.ExtensionsLogger.Use(loggerFactory);
    }

    public async Task StartAsync(CancellationToken cancellationToken)
    {
        await _bus.StartAsync(cancellationToken).ConfigureAwait(false);
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        return _bus.StopAsync(cancellationToken);
    }
}

А затем добавьте в свою конфигурацию:

services.AddSingleton<IHostedService, MassTransitConsoleHostedService>();
...