Я разрабатываю веб-решение с использованием MassTransit + RabbitMQ. Некоторое время назад я заметил, что когда я запускаю свои интеграционные тесты, некоторые из них начинают неожиданно и очень непоследовательно зависать в течение очень долгого времени. После непродолжительного расследования я обнаружил, что мой код висит где-то внутри метода ServiceBus.Publish (T message).
К сожалению, документация MassTransit и сообщения в блогах, которые я нашел, не дают ответа на вопрос, в чем причина и как решить эту проблему. Надеюсь, здесь кто-то может помочь решить эту проблему.
Вот как я инициализирую служебную шину:
ServiceBusFactory.New(sbc =>
{
sbc.ReceiveFrom(busAddress);
sbc.UseRabbitMq(r =>
{
r.ConfigureHost(new Uri(busAddress),
cfg =>
{
if (!string.IsNullOrEmpty(busUser) && !string.IsNullOrEmpty(busPass))
{
cfg.SetPassword(busPass);
cfg.SetUsername(busUser);
}
});
});
sbc.UseControlBus();
sbc.SetCreateMissingQueues(true);
sbc.SetCreateTransactionalQueues(true);
sbc.SetNetwork("workgroup");
sbc.UseBsonSerializer();
sbc.SetDefaultRetryLimit(2);
sbc.SetDefaultTransactionTimeout(new TimeSpan(0, 0, timeoutSec));
sbc.Validate();
});
Значение timeoutSec - 10 Служебная шина инициализируется один раз и регистрируется в контейнере Autofac.
Публикация происходит путем вызова метода IServiceBus.Publish (...).
Одно из решений - обернуть метод Publish (...) в Task и использовать метод Task.Wait (...) для обеспечения тайм-аута, но это не похоже на хорошее решение.
Буду очень признателен за любую помощь!
ВАЖНОЕ ОБНОВЛЕНИЕ 26 января 2017 г .: этот вопрос относится к MT v2. Похоже, что у MT v3 аналогичная проблема, если забыть "ждать". Моя проблема не связана с "ожиданием" и в настоящее время (до сих пор) не имеет хорошего решения (насколько мне известно). Я настоятельно рекомендую всем перейти на MT v3.