我有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应用程序启动并发布事件before,则consumer应用程序启动,则这些事件将丢失。通过遵循文档https://masstransit-project.com/usage/containers/simpleinjector.html我可以看到masstransit有它自己的方法来定义简单注入器中的使用者,但没有一种方法来定义发布者。我可以找到这个:
cfg.Publish<ScreeningAddedIntegrationEvent>(@event =>
{
@event.Durable = false; // default: true
});
这有助于我定义我要发布特定消息的方式,但仍未在后台创建任何队列或交换。
这是MT / RMQ的工作方式。 MT显然不可能根据您的应用程序流程来确定您可以发布或不发布哪些事件。在启动将要开始发布的服务之前,您应该确保首先启动消费服务,或者至少已正确设置总线拓扑。