Как правильно обрабатывать exeptions для бесконечного чтения сервера по http?
Я разрабатываю систему, которая должна постоянно мониторить server (в моем случае это esp-8266 с rfid), мое javafx клиент-приложение отправляет GET/POST запросы на esp, в ожидании увидеть там новую строку.
Как правильно осуществить бесперебойную связь с ней, я хочу чтобы помехи с wifi на стороне сервера и клиента никак не мешали, и связь с контрольной платой восстанавливалась, несмотря на долгие перерывы в связи.
Я написал что-то более-менее рабочее, но во время тестирования всё равно очень редко, но возникает ситуация, когда поток чтения не восстанавливается...
private void handleExecuter1(ExecutorService executor, String arduinoUrl) {
if (!executor.isShutdown()) {
System.out.println("Поток не завершен, убиваю");
// Ожидаем завершения выполнения задач в текущем пуле
executor.shutdown();
try {
if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
// Если задачи не завершились за указанное время, вызываем shutdownNow()
executor.shutdownNow();
if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
try {
while (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
System.out.println("Ожидаю завершения потоков...");
}
System.out.println("Все потоки завершены успешно.");
} catch (InterruptedException eee) {
// Обработка прерывания
eee.printStackTrace();
System.out.println("Восстанавливаю флаг");
Thread.currentThread().interrupt();
}
}
}
} catch (InterruptedException ex) {
// Обработка прерывания, если необходимо
ex.printStackTrace();
}
System.out.println("Убил");
}
executor = Executors.newSingleThreadExecutor();
executor.execute(createArduinoDataReader(arduinoUrl));
}
public boolean go = true;
// Пул запуска
private final ExecutorService executor2 = Executors.newSingleThreadExecutor();
public volatile boolean keepRunning = true;
public void startReceiverThread(String arduinoUrl) {
// if (сontroller.wifiConnection.keepRunning) {
if (keepRunning) {
if (!checkConnection("http://" + arduinoUrl + ":1027/")) {
System.out.println("Не прошло проверку! CheckConnection");
keepRunning = false;
try {
throw new IOException("Соединение потеряно");
} catch (IOException e) {
System.out.println("Не прошло проверку! CheckConnection");
System.out.println(arduinoUrl+"не пытаемся переподключить! нет доступа изначально!");
}
} else {
keepRunning = true;
}
//
executor2.execute(() -> {
while (сontroller.wifiConnection.keepRunning) {
// while (keepRunning) {
try {
if (!checkConnection("http://" + arduinoUrl + ":1027/post")) {
System.out.println("Соединение потеряно c "+ arduinoUrl + ". Пытаемся восстановить...");
TimeUnit.SECONDS.sleep(3);
} else {
try {
recivingDataFromArduino2(arduinoUrl);
System.out.println(executor2.isShutdown()+""+arduinoUrl);
} catch (Exception e) {
сontroller.wifiConnection.handleExecuter1(executor, arduinoUrl);
TimeUnit.SECONDS.sleep(3);
}
}
TimeUnit.MILLISECONDS.sleep(900); // Пауза между запросами на прием данных
} catch (InterruptedException e) {
System.out.println("метод старт Восстанавливаю флаг");
Thread.currentThread().interrupt(); // Восстанавливаем флаг прерывания
} catch (Exception e) {
// Дополнительная обработка исключений внутри задачи
System.out.println("Упал поток запуска! Пытаюсь стартануть");
if (!executor2.isShutdown()) {
System.out.println("Поток еще не заврешен ");
executor2.shutdown();
farmGuardController.wifiConnection.keepRunning = false;
System.out.println("Убил");
} else {
System.out.println("Запускаю метод startReceiverThread");
startReceiverThread(arduinoUrl);
System.out.println("Запустил");
}
}
}
});
}
}`