1

NServiceBus を調査していますが、このシナリオを処理するために NServiceBus をどのように使用できるか (または使用できるかどうか) がわかりません。

複数のクライアントが作業要求を送信しており、ディストリビューターはそれをワーカーにファームアウトしています。作業が完了するまでに時間がかかるため、最初のリクエストを送信したクライアントに作業者に進捗状況を報告してもらいたい.

全二重サンプルと、そのサンプルにディストリビューターを追加する方法も確認しました。これらは機能していますが、一連の進行状況メッセージで応答するように変更すると (以下に示すコードのように、メッセージ間に遅延があります)、クライアントはすべての進行状況メッセージを同時に受け取ります。

public class RequestDataMessageHandler : IHandleMessages<RequestDataMessage>
{
    public IBus Bus { get; set; }

    public void Handle(RequestDataMessage message)
    {
        for (var i = 0; i < 10; i++)
        {
            var count = i;
            var response = this.Bus.CreateInstance<DataResponseMessage>(m =>
                {
                    m.DataId = message.DataId;
                    m.Progress = count * 10;
                });

            this.Bus.Reply(response);

            Thread.Sleep(1000);
        }
    }
}

NServiceBus がどのように機能するかについて、基本的なことを理解していないのではないかと思います。誰かが私が間違っている場所を説明したり、いくつかの例やドキュメントを教えてくれませんか?

4

2 に答える 2

2

作成したものは、常に同じトランザクションの一部としてメッセージを送信します。ハンドラーごとに 1 つのトランザクションがあるため、この方法で進行状況を伝えることはできません。進行状況を伝える処理のチャンクごとに個別のエンドポイントが必要になります。トランザクションに関与しないものを外部から更新することで、進行状況の伝達を実装しました。これは、非トランザクション メッセージを別のエンドポイントに送信して進行状況を更新するか、RPC 呼び出しのようなものを送信することで実行できます。そこから、進行中のデータ ストアをポーリングすることができます。

于 2011-01-25T20:47:16.980 に答える
1

ワーカーに bus.Reply() を使用してメッセージをクライアントに送り返すように指示します。返信は、元のメッセージを送信したエンドポイントにメッセージを自動的に送信します

于 2011-01-25T17:10:03.423 に答える