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
}
}
}
私が達成しようとしていることの説明:
クライアント- 単一のサーバーにメッセージを送信します。サーバーが使用できない場合、クライアントはメッセージをブロックしたり破棄したりしてはなりません。クライアントはいつでもオフライン/オンラインになることができます。
サーバー- 単一のクライアントからメッセージを受信します。サーバーは、メッセージが受信されるまでブロックします。サーバーはメッセージの長い処理を行う必要があり、処理中に他のメッセージを失うべきではありません。サーバーはいつでもオフライン/オンラインになることができます。