Я разрабатываю MessagePack серверные и клиентские приложения, и мне нужно знать, когда одноранговый узел отключается. Обычно у меня есть поток, вызывающий InputStream#read
сокета для анализа вводимых данных, и я бы проверил возврат -1
, чтобы обнаружить, что другая сторона закрыла соединение.
Эта стратегия не отображается для работы в контексте использования InputStream с MessagePack. Распаковщик имеет метод hasNext
, который возвращает логическое значение, если есть элемент для распаковки. Если поток закрывается и read
возвращает -1
, hasNext
просто возвращает false
. Таким образом, любой цикл потока на unpacker.hasNext
начнет вращаться, что нежелательно.
Я вижу только две альтернативы, ни одна из которых не идеальна.
- Запись данных в сокет .
Я могу записывать сердцебиение в сокет каждые n
секунду и искать IOException
. Я не против сердцебиения в моем приложении, на самом деле они, вероятно, являются для меня требованием, но сердцебиение, вероятно, будет с интервалами 30se c или более длительными, что означает, что мой поток приема по-прежнему вращается максимально долго. Я понимаю, что 30 секунд c спиннинга - не самое худшее, но я определенно хочу избегать его, если это вообще возможно.
Найдите (или напишите) другую библиотеку MessagePack.
Библиотека Python имеет метод feed
, который позволяет вам управлять свой собственный буфер и загрузите байты распаковщика, как считаете нужным. Это позволит проверить возвращаемое значение на read
. Однако это все еще не идеально, потому что теперь я создал дополнительную операцию копирования. Избежание этой копии было одной из причин, по которой я вообще хотел перейти на MessagePack. Кроме того, если я не могу найти библиотеку, написание моей собственной, вероятно, будет сложнее, чем я готов взять на себя.
Я хочу обнаружить отключение однорангового узла без снижения производительности, такого как вращение или копирование. Есть ли способ сделать это?