Я установил простой тест, включающий издателя с двумя подписчиками, все из которых работают на одной машине с использованием MSMQ и MassTransit (2.1.1) RuntimeServices, которая использует локальную базу данных Sql Server.MassTransit MSMQ Pub с мульти-sub. Когда RuntimeServices готов?
Я включил код шины, который был указан ниже, чтобы вы могли видеть, что настроено. Я запускаю каждый компонент вручную и самостоятельно, чтобы попытаться разобраться, что произойдет, если абонент не работает.
Сначала я запустил двух подписчиков, чтобы все очереди и подписки были настроены, а затем вышли из них оба, не отписавшись от сообщений. Если я затем запустил издатель самостоятельно, который сбрасывает 400 сообщений в очередях настолько быстро, насколько это возможно, я вижу, что две очереди подписчиков имеют различное количество ожидающих сообщений.
Мое предположение заключается в том, что я публикую до того, как RuntimeServices удалось установить обе очереди назначения. С 5-секундной задержкой между настройкой шины и публикацией я получаю то, что ожидаю 400 сообщений, ожидающих в обеих абонентских очередях, то есть некоторые сообщения не были опубликованы в обе очереди.
Мой вопрос в том, что; Есть ли способ узнать, готов ли RuntimeServices к подписчикам уже в своей базе данных при запуске издателя?
Это код издателя
Bus.Initialize(sbc =>
{
sbc.SetCreateTransactionalQueues(true);
sbc.ReceiveFrom("msmq://localhost/andy_publisher");
sbc.UseSubscriptionService("msmq://localhost/mt_subscriptions");
sbc.UseMsmq();
sbc.VerifyMsmqConfiguration();
});
var bus = Bus.Instance;
Thread.Sleep(5000); // this makes it all work :)
int i = 0;
foreach (string filename in System.IO.Directory.EnumerateFiles(@"C:\Users\andy.baker\Pictures\", "*.*", SearchOption.AllDirectories))
{
Console.WriteLine(filename);
bus.Publish(new Messages.FileRegistered {FilePath = filename});
i++;
}
Console.WriteLine("Published {0} messages", i);
Console.ReadLine();
Абоненты сконфигурированы так;
Bus.Initialize(sbc => {
sbc.UseMsmq();
sbc.VerifyMsmqConfiguration();
sbc.ReceiveFrom("msmq://localhost/andy_subscriber1");
sbc.UseSubscriptionService("msmq://localhost/mt_subscriptions");
}
);
... и второй абонент ...
Bus.Initialize(sbc =>
{
sbc.UseMsmq();
sbc.VerifyMsmqConfiguration();
sbc.ReceiveFrom("msmq://localhost/andy_subscriber2");
sbc.UseSubscriptionService("msmq://localhost/mt_subscriptions");
}
Заранее спасибо за любые советы.