Mam moduł wtyczki, który trafia do aplikacji internetowej. Jeśli moduł nie ładuje się poprawnie, aplikacja internetowa nie ma sensu, a aplikacja internetowa prawdopodobnie nie ładuje się wcale, wolelibyśmy, aby ten moduł zawsze był poprawnie inicjowany. Gdybym rzucił wyjątek środowiska wykonawczego, dostałby się do logów i po prostu zostałby zignorowany, ponieważ aplikacja i tak będzie kontynuowana, a użytkownicy końcowi nigdy by się nie dowiedzieli ... Wiem, że błędy mają być zgłaszane tylko pod wyjątkowe warunki i zazwyczaj dotyczą sytuacji, z których system nie może się wyleczyć, ale co byś zrobił w takiej sytuacji?Czy można rzucić java.lang.Error?
Odpowiedz
tylkoError
który ja regularnie wykorzystywane w kodzie biznesowym jest ExceptionInInitializerError
. Nie masz innego wyboru w blokach inicjalizatora static
.
Ale nawet jeśli wrzucisz to do aplikacji internetowej, webaplikacja nadal będzie nasłuchiwała na żądaniach HTTP. Najlepiej jest załadować moduł lub zainicjować go wewnątrz urządzenia Filter
, słuchając na url-pattern
z /*
i pozwól, aby Filter
zablokował odpowiednio żądania HTTP. Na przykład.
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.");
}
}
Da to błąd HTTP 500 z podaną wiadomością.
Nie jestem pewien jak dokładnie, ale OSGi ma zarządzanie zależnościami pakietów (= podobne do wtyczek). Jeden pakiet nie ładuje się, dopóki inny pakiet nie będzie gotowy. Być może możesz użyć tego samego mechanizmu (lub po prostu użyć samego OSGi;)), aby poczekać na jedną wtyczkę/aplikację, dopóki kolejna wtyczka nie będzie gotowa. Lub zamkniesz aplikację podczas uruchamiania, jeśli nie możesz znaleźć/załadować poprawnie wtyczki.
Wygląda jak młotek wszystkich gwoździ, jednak lubię OSGi, mam tendencję do pochwały. Poza tym powinien działać każdy rodzaj mechanizmu zarządzania zależnościami (IoC, ty to nazwij). – Riduidel
Zaloguj się błąd, a następnie użyj System.exit po prostu zamknąć aplikację
Nie zapewnia to żadnego wskazania (poza kodem powrotu), dlaczego aplikacja nie działa. –
@HotLicks Dodałem propozycję, aby najpierw zarejestrować błąd, a następnie zakończyć. – Demi
nie powinien być błąd, ale niektóre odpowiednie podklasy, albo istniejące lub jeden zdefiniować. Ale wyrzucenie podklasy błędu jest odpowiednie w twojej sytuacji. –