Итак, у меня есть ClassLoader
потомок, который идет по сети для загрузки необходимых классов. Как правильно обрабатывать временные ошибки (такие как временное отключение сети) или тайм-аут, когда поток прерывается?
Проблема здесь в том, что единственное, что я могу выбросить из loadClass()
, это ClassNotFoundException
. Кажется, что JVM не будет повторно пытаться загрузить класс после выброса CNFE, вместо этого он будет запускать NoClassDefFoundError
из кода Java.
Это логично, но не учитывает временные ошибки. Если мы выбросили CNFE из Class Loader, это означает, что класс никогда не будет доступен, и код никогда не будет работать должным образом, даже если проблема будет решена и класс может быть загружен при повторной попытке. Длительное ожидание из кода загрузки классов нежелательно и не всегда возможно.
Что еще хуже, Class Loader может быть прерван. Это вызовет InterruptedException при ожидании сетевой операции, что, в свою очередь, потребует выброса CNFE, что снова приведет к непригодному состоянию, когда классный файл не загружается и никогда не будет, а код не работает.
Есть ли здесь рекомендуемое решение о том, как обрабатывать временные сбои загрузки классов? Я бы предпочел, чтобы код получал ClassNoDefFoundError
один раз, но повторите попытку в следующий раз, когда это необходимо.
В основном у меня есть две идеи:
- Мы можем пометить загрузчик классов как плохой, как только он пострадает от временной ошибки, прекратить его использование и создать новый, который может повторить попытку загрузки этого класса.
- (даже более частично) Мы могли бы удалить флаг прерывания из потока и в любом случае дождаться загрузки класса, а затем восстановить флаг прерывания в потоке.
Может быть, я даже ошибаюсь, и JVM обычно не генерирует NoClassDefFoundError
, не обращаясь к загрузчику классов каждый раз?