LINUX.ORG.RU

Неправильное поведение ZFrame.recvFrame после обрыва связи у клиента

 , , ,


0

3

Доброго времени суток!

После обрыва связи у клиента, ZFrame.recvFrame перестает получать фреймы именно от него. От других клиентов, у которых не было сбоя, фреймы приходят. Если перезапустить сервер, все стабилизируется.

Хочется понять почему так происходит и как такую ерунду обрабатывать, чтобы клиенты не отпадали.

Код:

        HashMap<ZFrame, List<String>> idHM = new HashMap<ZFrame, List<String>>();
        ZMQ.Context context = ZMQ.context(1);

        try (
                ZMQ.Socket responder = context.socket(ZMQ.ROUTER)) {
            responder.bind("tcp://*:5556");

            while (!Thread.currentThread().isInterrupted()) {
                // Wait for next request from the client
                ZFrame identity = ZFrame.recvFrame(responder);
                String message = responder.recvStr();
                List<String> idTickers = parseMessage(message);
                idHM.put(identity, idTickers);

                try {

                    broadCastToClients(identity, message, idHM, responder);
                    Thread.sleep(100);

                } catch (InterruptedException ex) {
                    Logger.getLogger(IQFeedStream.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        context.term();

Собственно, вот именно эта строчка не получает фреймы от проблемных клиентов:

ZFrame identity = ZFrame.recvFrame(responder);

Может кто-то сталкивался с подобной проблемой? Есть идеи в какую сторону копать?

★★★

Последнее исправление: observer (всего исправлений: 1)

Я вообще не в теме, но рискну предположить, что нужно переинициализировать responder. Но я прямо вообще наугад сказал.

cdshines ★★★★★
()
Ответ на: комментарий от cdshines

Проблема в том чтобы понять, что появился такой проблемный клиент и нужен рестарт. А вообще, хотелось бы в корне решить эту проблему и решить правильно, а не костылем. То есть, чтобы сервер мог нормально получать данные от клиента при его повторном подключении после сбоя.

Сейчас пробую обновиться к новой версии zeromq, может какой-то баг в старой версии.

Еще в теории, может дело в каких-то тонких настройках сокета.

observer ★★★
() автор топика
Последнее исправление: observer (всего исправлений: 1)

У тебя, похоже, рассинхрон во внутренних состояниях серверного и клиентского zmq сокета. Смею предположить, что твои проблемные клиенты имеют свои identity, которые захардкожены или читаются из конфига. Как следствие, после падения клиенты начинают с чистого листа, а сервер чего-то ждет, согласно внутреннему стейту.

Как это исправить на стороне сервера - хз, возможно никак.

indie
()
Ответ на: комментарий от indie

Спасибо за наводку.

Сделал генерацию нового identity при повторном подключении клиента. К счастью, это не вызывает никаких конфликтов. Проблема решена.

observer ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.