Я пытаюсь реализовать простую передачу сообщений между двумя приложениями с помощью NetMQ (чуть более подробное описание того, чего я пытаюсь достичь, приведено ниже).
После нескольких проб и ошибок я обнаружил, что не могу просто отправляйте или получайте сообщения сразу после вызовов 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
}
}
}
Описание того, чего я пытаюсь достичь:
Клиент — отправляет сообщения на один сервер. Клиент не должен блокировать и не должен отбрасывать сообщения, когда сервер недоступен. Клиент может выйти в оффлайн/онлайн в любое время.
Сервер — получает сообщения от одного клиента. Сервер блокируется до получения сообщения. Сервер должен выполнять длительную обработку сообщения и не должен терять никакие другие сообщения во время обработки. Сервер может перейти в оффлайн/онлайн в любое время.
true
вSend
. - person Peter Ritchie   schedule 22.06.2014