3

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");
        }

アドバイスをよろしくお願いします。

4

1 に答える 1

1

消費者をどのように購読していますか? 再起動後も存続するには、それらを永続的にする必要があります。 http://docs.masstransit-project.com/en/latest/configuration/sub_config_api.html

s.Consumer<TConsumer>().Permanent();
于 2012-08-10T18:03:51.347 に答える