Используя сокет обмена сообщениями ZMQ.SocketType.REP
(ответ) с ZeroMQ, я получаю сообщения, а затем отправляю сообщение "OK" обратно.
Сейчас я пытаюсь это сделать локально (отправка / получение сообщений из того же консольного приложения C #, работающего на той же машине).
Довольно регулярно (примерно через 1500 сообщений), строка:
var receivedBytes = _recvSocket.Recv();
... сгенерирует исключение: Context was terminated
У меня вопрос: почему это происходит, и как вы восстанавливаетесь после него ?
У меня есть System.Threading.Thread
, предназначенный для запуска моего "серверного" сокета ответа ZeroMQ, вот цикл, который он запускает:
private static void MessagingLoopReceive(object state)
{
if (_zmqc == null)
{
_zmqc = new ZMQ.Context(1);
}
_recvSocket = _zmqc.Socket(ZMQ.SocketType.REP);
_recvSocket.Bind("tcp://*:5556");
while (true)
{
if (_queueStop)
{
break;
}
//Console.WriteLine("Server blocking for receive...");
var receivedBytes = _recvSocket.Recv();
if (receivedBytes != null && receivedBytes.Length > 0)
{
//Console.WriteLine("Server message received from client, sending OK");
_recvSocket.Send("OK", Encoding.ASCII);
//Console.WriteLine("Server OK sent, adding message to queue");
_queuedMessages.Enqueue(receivedBytes);
}
else
{
Thread.Sleep(1);
}
}
}