Как сделать тайм-аут для сломанного сервера

Я беру распределенный курс. Теперь я хочу установить тайм-аут для клиента, когда он отправляет или получает данные с разрушенного сервера, и позволить ему повторно подключиться к доступному серверу. Я хочу добавить сюда кое-что, чтобы клиент понял, что времени уже достаточно. sendMessage(new TextMessage(kvjson)); TextMessage resultMsg = receiveMessage();

Я подумал об использовании потока здесь, как счетчик, и когда время истечет, просто пропустите оператор вверх. но я понял, что если есть сломанный сервер, клиент может просто застрять внутри метода и никогда не получить возврат. плюс я не знаю, как сообщить основному процессу, что мой тайм-аут уже закончился. Я думаю, это связано что-то с прерыванием и сном? После проверки онлайн-источника я все еще в замешательстве. Я размещаю это здесь. Заранее спасибо за ваш ответ и терпения!

Если это HTTP-сервер, почему бы вам не управлять аварийным переключением / HA с помощью серверного балансировщика нагрузки? Кроме того, если это клиент Java, вы можете установить соединение и / или тайм-аут чтения (вам нужно будет прочитать документацию вашего конкретного клиента)

ernest_k 22.03.2018 19:53

Я пишу клиент и сервер самостоятельно. Все серверы подключаются к ECS. Нет такой клиентской документации

johnway yang 22.03.2018 19:56

Если вы решили изобретать велосипед, по крайней мере, вы можете учиться у многих серверов и клиентов с открытым исходным кодом. Выберите один и проверьте его исходный код ...

ernest_k 22.03.2018 20:00
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
29
1

Ответы 1

Вы можете обернуть свой клиентский вызов в отдельный поток и использовать объект Future для ожидания ответа. Объект Future будет ждать столько, сколько вы захотите, и через какое-то время может выйти из строя. Затем вы можете справиться с тайм-аутом. См. Пример ниже.

    ExecutorService executor = Executors.newSingleThreadExecutor();
    Future<String> future = executor.submit(() -> {

        //long running process
        TimeUnit.SECONDS.sleep(10);
        return "finished";
    });

    try {
        future.get(5, TimeUnit.SECONDS);
    } catch (Exception e) {
        //deal with the timeout
    }

Другие вопросы по теме