在发布者端为 MassTransit 在 SimpleInjector 中建立队列

Establishing queues in SimpleInjector for MassTransit on the Publisher side

我有 2 个应用程序,一个是事件发布应用程序,一个是事件消费者应用程序。 发布者使用 SimpleInjector:

container.AddMassTransit(x =>
{
    x.AddBus(() => Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        var host = cfg.Host(ConfigurationValuesProvider.Current.Get("RabbitHostName"), hostConfigurator =>
        {

        });

    }));
});

使用 CastleWindsor 的消费者:

container.AddMassTransit(x =>
{
    x.AddBus(context => Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        var host = cfg.Host(configurationProvider.RabbitHostName);

        x.AddConsumer<FactAddedHandler>();
        x.AddConsumer<FactAddedWebhookHandler>();
        x.AddConsumer<FactMonitorHandler>();

        cfg.ConfigureEndpoints(container);
    }));

});

当我启动 consumer 应用程序时,它会为相关订阅者创建所有队列和交换。但是,当我只启动发布应用程序时,不会发生这种情况。这意味着如果不存在队列并且 publisher 应用程序启动并发布事件 beforeconsumer 应用程序是开始,那些事件就丢失了。 按照文档 https://masstransit-project.com/usage/containers/simpleinjector.html 我可以看到 masstransit 有自己的方式来定义简单注入器中的消费者,但没有定义发布者的方式。 我可以找到这个:

cfg.Publish<ScreeningAddedIntegrationEvent>(@event =>
{
    @event.Durable = false; // default: true
});

这有助于我定义发布特定消息的方式,但仍未在后台创建任何队列或交换。

这就是 MT /RMQ 的工作原理。 MT 显然不可能根据您的应用程序流程来确定您可以或不可以发布哪些事件。在启动将开始发布的服务之前,您应该确保首先启动您的消费服务,或者至少正确设置总线拓扑。