我已經設置了一個簡單的測試,包括一個有兩個訂閱者的發佈者,所有這些都使用MSMQ和使用本地Sql Server數據庫的MassTransit(2.1.1)RuntimeServices運行。MassTransit MSMQ Pub with multi-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");
}
先感謝您的任何意見。