2 つのサブスクライバーを持つパブリッシャーで構成される簡単なテストをセットアップしました。これらはすべて、MSMQ と、ローカルの SQL Server データベースを使用する MassTransit (2.1.1) RuntimeServices を使用して単一のマシンで実行されます。
何が設定されているかを確認できるように、以下にバス設定コードを含めました。各コンポーネントを手動で個別に開始して、サブスクライバーが実行されていない場合に何が起こるかを調べています。
最初に 2 つのサブスクライバーを実行したため、キューとサブスクリプションがすべてセットアップされ、メッセージのサブスクライブを解除せずに両方を終了しました。次にパブリッシャーを単独で実行すると、キューに 400 個のメッセージができるだけ早くダンプされます。2 つのサブスクライバー キューで待機しているメッセージの数が異なることがわかります。
私の想定では、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");
}
);
...そして 2 番目の加入者...
Bus.Initialize(sbc =>
{
sbc.UseMsmq();
sbc.VerifyMsmqConfiguration();
sbc.ReceiveFrom("msmq://localhost/andy_subscriber2");
sbc.UseSubscriptionService("msmq://localhost/mt_subscriptions");
}
アドバイスをよろしくお願いします。