7

NetMQ を使用して 2 つのアプリケーション間で単純なメッセージ パッシングを実装しようとしています (達成しようとしていることのもう少し詳しい説明を以下に示します)。
少し試行錯誤した後、Connect/Bind 呼び出しの直後にメッセージを送受信できないことがわかりました。これは、メッセージはブロックされておらず、接続がまだ確立されていなくても実際に返されるためです。
今のところ、Thread.Sleep() を使用してこれを解決しましたが、これは味が悪く、実稼働システムには絶対に適していません。

問題は、NetMQ/ZeroMQ でそれを行うにはどうすればよいかということです。

クライアントの例:

        using (NetMQContext ctx = NetMQContext.Create())
        {
            using (var client = ctx.CreatePushSocket())
            {
                client.Connect("tcp://127.0.0.1:5555");
                Thread.Sleep(100); // wait for connection

                for (int i = 0; i < 5; i++) 
                {
                    client.Send("test " + i , true);
                }
            }
        }
    }

サーバーの例:

    using (NetMQContext ctx = NetMQContext.Create())
    {
        using (var server = ctx.CreatePullSocket())
        {
            server.Bind("tcp://127.0.0.1:5555");
            Thread.Sleep(100); // wait for connection
            while (true)
            {
                var str = server.ReceiveString();
                Console.Out.WriteLine(str);
                Thread.Sleep(60*1000); // do msg processing
            }
        }
    }

私が達成しようとしていることの説明:

クライアント- 単一のサーバーにメッセージを送信します。サーバーが使用できない場合、クライアントはメッセージをブロックしたり破棄したりしてはなりません。クライアントはいつでもオフライン/オンラインになることができます。

サーバー- 単一のクライアントからメッセージを受信します。サーバーは、メッセージが受信されるまでブロックします。サーバーはメッセージの長い処理を行う必要があり、処理中に他のメッセージを失うべきではありません。サーバーはいつでもオフライン/オンラインになることができます。

4

2 に答える 2

10

受信と送信の両方が実行可能になるまで待機できます。例では dontWait パラメータに true を渡しました。削除するだけで、可能なときにメッセージが送信されます。

受信の場合、メッセージが利用可能になるまで待機するため、スリープする必要はありません。

提案されているように、ポーラーを使用することも解決策です (ソケットが送信可能になったとき、およびメッセージが消費される準備ができたときにポーリングできます)。ポーラー クラスのテストをご覧ください: https://github.com/zeromq/netmq/blob /3.3.3-rc5/src/NetMQ.Tests/PollerTests.cs .

于 2014-06-22T13:20:12.723 に答える