Как обработать временную ошибку загрузки класса, такую ​​как прерывание потока - PullRequest
0 голосов
/ 03 июля 2019

Итак, у меня есть ClassLoader потомок, который идет по сети для загрузки необходимых классов. Как правильно обрабатывать временные ошибки (такие как временное отключение сети) или тайм-аут, когда поток прерывается?

Проблема здесь в том, что единственное, что я могу выбросить из loadClass(), это ClassNotFoundException. Кажется, что JVM не будет повторно пытаться загрузить класс после выброса CNFE, вместо этого он будет запускать NoClassDefFoundError из кода Java.

Это логично, но не учитывает временные ошибки. Если мы выбросили CNFE из Class Loader, это означает, что класс никогда не будет доступен, и код никогда не будет работать должным образом, даже если проблема будет решена и класс может быть загружен при повторной попытке. Длительное ожидание из кода загрузки классов нежелательно и не всегда возможно.

Что еще хуже, Class Loader может быть прерван. Это вызовет InterruptedException при ожидании сетевой операции, что, в свою очередь, потребует выброса CNFE, что снова приведет к непригодному состоянию, когда классный файл не загружается и никогда не будет, а код не работает.

Есть ли здесь рекомендуемое решение о том, как обрабатывать временные сбои загрузки классов? Я бы предпочел, чтобы код получал ClassNoDefFoundError один раз, но повторите попытку в следующий раз, когда это необходимо.

В основном у меня есть две идеи:

  • Мы можем пометить загрузчик классов как плохой, как только он пострадает от временной ошибки, прекратить его использование и создать новый, который может повторить попытку загрузки этого класса.
  • (даже более частично) Мы могли бы удалить флаг прерывания из потока и в любом случае дождаться загрузки класса, а затем восстановить флаг прерывания в потоке.

Может быть, я даже ошибаюсь, и JVM обычно не генерирует NoClassDefFoundError, не обращаясь к загрузчику классов каждый раз?

1 Ответ

0 голосов
/ 03 июля 2019

Проблема здесь в том, что единственное, что я могу выбросить из loadClass () - это ClassNotFoundException

Вы пытались вызвать какое-то непроверенное исключение?Интересно, как виртуальная машина справится с этим.

Я бы предпочел, чтобы код получал ClassNoDefFoundError один раз, но в следующий раз нужно повторить попытку

быть в порядке с произвольным (числом) потоком (ами), прерывающимся в произвольной точке из-за ClassDefNotFoundError (обратите внимание на суффикс Error ...), если другие потоки повторяют загрузку класса позже?

Кажется, что ClassDefNotFoundError, также по его имени, считается невосстановимым, что имеет смысл для большинства приложений.

...