Загрузка потребителей MassTransit из сборки
При загрузке потребителей MT из сборки (используя StructureMap
контейнер / MassTransit.StructureMap
сообщения интеграции пакета) обрабатываются частично: шина обрабатывает сообщения, хранящиеся в очереди, и не отвечает после этого, хотя вы можете видеть сообщения, добавленные в очередь. Затем, если вы перезапустите приложение, оно будет обрабатывать ожидающие сообщения в очереди и больше ничего не будет делать.
Вот настройки:
public class Application {
public static void Main() {
var container = new Container();
container.Configure(c => c.Scan(scan => {
scan.TheCallingAssembly();
scan.AddAllTypesOf<IConsumer>();
}));
var bus = ServiceBusFactory.New(sbc => {
sbc.UseRabbitMq();
sbc.ReceiveFrom("rabbitmq://localhost/app_commands");
sbc.Subscribe(x => x.LoadFrom(container));
sbc.Validate();
});
container.Inject(bus);
Console.WriteLine("* mt bus has been registered");
Console.ReadKey();
}
}
Соответствующий потребитель находится в той же сборке. Если я изменю код подписки на это:
sbc.Subscribe(x => x.Consumer<SendDocumentCommandHandler>().Permanent());
явно указав тип потребителя и сделав его постоянным, он будет реагировать на входящие команды.
Зарегистрированы ли потребители с использованием LoadFrom
постоянный?
код потребителя:
public class SendDocumentCommandHandler : Consumes<SendDocumentCommand>.All {
private IServiceBus bus;
public void Consume(SendDocumentCommand message) {
Console.WriteLine("Message of type: {0} has been consumed", message.GetType().Name);
}
public SendDocumentCommandHandler() { }
public SendDocumentCommandHandler(IServiceBus bus) {
this.bus = bus;
}
}
1 ответ
Вы должны убедиться, что жизненный цикл IServiceBus
(будучи IDisposable
) преждевременно не завершается StructureMap. Где вы ввели IServiceBus
для потребителя, вероятно, что когда потребитель утилизируется, автобус отключается.
Итак container.Inject()
может потребоваться некоторые дополнительные свойства, чтобы избежать его удаления StructureMap.
Также вы можете использовать IConsumeContext
чтобы получить IServiceBus
(с использованием Bus
собственности), поэтому нет необходимости вводить его в потребителя.