У меня есть сменный модуль, который входит в веб-приложение. Если модуль не загружается правильно, не имеет смысла для веб-приложения продолжаться, и веб-приложение не должно, вероятно, загружаться вообще, мы предпочли бы, чтобы этот модуль инициализировал правильно всегда. Если бы я должен был выдать исключение на этапе выполнения, то оно вошло бы в журналы, и просто игнорироваться, так как приложение продолжится так или иначе, и конечные пользователи никогда не знали бы... Я знаю, что ошибки предназначены, чтобы быть брошенными только при исключительных условиях, и они обычно имеют отношение к ситуациям, что система не может восстановиться с, но что Вы сделали бы в такой ситуации?
Единственная ошибка
, которую я регулярно использовал в бизнес-коде, - это ExceptionInInitializerError
. У вас нет другого выбора в блоках инициализатора static
.
Но даже если вы бросите это в веб-приложение, оно все равно продолжит прослушивание HTTP-запросов. Лучше всего выполнить загрузку или инициализацию модуля внутри фильтра
, прослушивая URL-шаблон
из / *
, и пусть Фильтр
] соответственно заблокировать HTTP-запросы. Например.
private boolean allModulesAreLoaded;
@Override
public void init(FilterConfig config) {
try {
// Load modules.
allModulesAreLoaded = true;
} catch (Exception e) {
// Handle.
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
if (allModulesAreLoaded) {
chain.doFilter(request, response);
} else {
throw new ServletException("Not all modules are loaded.");
}
}
Это приведет к ошибке HTTP 500 с данным сообщением.
Не знаю, как именно, но OSGi получила управление зависимостями пакетов (= аналогично плагинам). Один пакет не загружается, пока не будет готов другой пакет. Возможно, вы можете использовать тот же механизм (или просто использовать сам OSGi;)), чтобы дождаться, пока один плагин / приложение не будет готов. Или вы закрываете приложение во время запуска, если оно не может правильно найти / загрузить ваш плагин.