MassTransit RabbitMQ AspNetCore 未启动总线并注册接收端点

Ben*_*son 5 c# masstransit .net-core asp.net-core

我已经为此奋斗了几个小时,但尽管看似复制了文档,但我似乎无法让它工作。

我正在使用新的 MassTransit AspNetCore 包来注册我的总线和消费者,但它似乎没有启动总线!如果我通过注册接收端点的代码添加断点,它永远不会被击中(但 AddBus 部分会被击中)并且交换/队列不会被创建。

值得注意的是,这只是一个在 IIS 中运行的 Web API,而且也有正常的休息端点(我不知道这是否重要)。

我的代码如下:

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);
        });
    }));
});
Run Code Online (Sandbox Code Playgroud)

我不禁觉得自己错过了一些非常明显的东西,但我一生都无法弄清楚。

Chr*_*son 7

您需要实际启动总线,在您的场景中应该使用托管服务来完成。您可以在此处查看示例:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,添加到您的配置中:

services.AddSingleton<IHostedService, MassTransitConsoleHostedService>();
Run Code Online (Sandbox Code Playgroud)


小智 6

实际上,IServiceHost 注册包含在库中,尽管文档中没有提及。需要使用扩展:

services.AddMassTransitHostedService()
Run Code Online (Sandbox Code Playgroud)