Почему MassTransit не отправляет сообщения в MSMQ, если подписчик не присутствует? Как это обойти?

Я использую MassTransit + MSMQ в качестве шины передачи сообщений, что, похоже, имеет разумный успех. Однако для некоторых тестов я хочу ставить сообщения в очередь, но никогда не удалять их. Похоже, что правильный способ сделать это - не подписываться на очередь напрямую. Вот мой код:

1) Я хочу отправлять и получать сообщения из одной очереди в этом процессе [это работает]:

    var solrMessageBus = ServiceBusFactory.New(sbc =>
        {
            sbc.UseMsmq();
            sbc.VerifyMsmqConfiguration();
            sbc.ReceiveFrom("msmq://localhost/my_queue");
            sbc.Subscribe(subs =>
            {
                subs.Handler<MyMessage>(msg => Enqueue(msg));
            });
        });

2) Я хочу отправлять сообщения из этого процесса, но не использовать их. MSMQ должен создавать большую очередь сообщений [это не работает]

    var solrMessageBus = ServiceBusFactory.New(sbc =>
        {
            sbc.UseMsmq();
            sbc.VerifyMsmqConfiguration();
            sbc.ReceiveFrom("msmq://localhost/my_queue");
        });

Я не эксперт по MassTransit, но приведенное выше кажется разумным способом поставить в очередь, не удаляя сообщения из той же очереди. В 1) я вижу, что сообщения попадают в мой MSMQ, но в 2) сообщения никогда не попадают в очередь.

Как я могу создать очередь, не удаляя сообщения?


person Chris    schedule 07.01.2014    source источник


Ответы (2)


Если вы не зарегистрируете какие-либо подписки на шине, очередь будет очищена, и все сообщения, отправленные в очередь, попадут в очередь _error.

Если вам нужно просто отправить сообщения в очередь, вы можете использовать EndpointCacheFactory (вместо фабрики служебной шины) для получения IEndpointCache, затем вызвать GetEndpoint (uri) и использовать метод Send для отправки сообщений в эту очередь. Это дает дополнительное преимущество, так как позволяет избежать использования пула потоков для получения сообщений, которые никогда не используются.

Также напоминаем, что у каждого экземпляра служебной шины должна быть собственная очередь.

person Chris Patterson    schedule 08.01.2014

Звучит разумно, но я никогда не пробовал.

Mass Transit строит сопоставление подписок из вашей настройки, а затем сопоставляет подписки с очередями (с использованием многоадресной подписки). Обратите внимание, что сообщения никогда не хранятся в очередях, назначенных отправителям, а скорее отправляются по многоадресной рассылке подписчикам. Нет подписчиков = негде разместить свои сообщения.

Чтобы постоянно ставить сообщения в очередь, я бы добавил подписчика, но приостановил бы его потребительский поток до завершения тестов.

person Wiktor Zychla    schedule 07.01.2014
comment
Это более или менее верный путь. Вы можете использовать статическую маршрутизацию и не заставлять своего потребителя работать, чтобы помочь. Список рассылки MT, вероятно, был бы лучшим местом для более подробного обсуждения. - person Travis; 08.01.2014