Я беру распределенный курс. Теперь я хочу установить тайм-аут для клиента, когда он отправляет или получает данные с разрушенного сервера, и позволить ему повторно подключиться к доступному серверу. Я хочу добавить сюда кое-что, чтобы клиент понял, что времени уже достаточно.
sendMessage(new TextMessage(kvjson));
TextMessage resultMsg = receiveMessage();
Я подумал об использовании потока здесь, как счетчик, и когда время истечет, просто пропустите оператор вверх. но я понял, что если есть сломанный сервер, клиент может просто застрять внутри метода и никогда не получить возврат. плюс я не знаю, как сообщить основному процессу, что мой тайм-аут уже закончился. Я думаю, это связано что-то с прерыванием и сном? После проверки онлайн-источника я все еще в замешательстве. Я размещаю это здесь. Заранее спасибо за ваш ответ и терпения!
Я пишу клиент и сервер самостоятельно. Все серверы подключаются к ECS. Нет такой клиентской документации
Если вы решили изобретать велосипед, по крайней мере, вы можете учиться у многих серверов и клиентов с открытым исходным кодом. Выберите один и проверьте его исходный код ...




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