Как правильно обрабатывать 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("Запустил");
                  }
              }
          } 
      });
  }
}`

Ответы (0 шт):