Загрузка потребителей 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 собственности), поэтому нет необходимости вводить его в потребителя.

Другие вопросы по тегам