2010-04-22 4 views
7

J'ai un module de plugin qui va dans une application web. Si le module ne se charge pas correctement, il n'est pas logique que l'application Web continue, et l'application Web ne devrait probablement pas charger du tout, nous préférerions que ce module s'initialise correctement toujours. Si je devais lancer une exception d'exécution, il entrerait dans les logs, et serait simplement ignoré puisque l'application continuerait de toute façon, et les utilisateurs finaux ne sauraient jamais ... Je sais que les erreurs sont censées être lancées seulement sous conditions exceptionnelles, et ils ont généralement à faire avec des situations que le système ne peut pas récupérer, mais que feriez-vous dans une telle situation?Est-il toujours possible de lancer java.lang.Error?

+0

ne devrait être erreur, mais une sous-classe appropriée, soit existant ou que vous définissez. Mais lancer une sous-classe d'Erreur est approprié dans votre situation. –

Répondre

4

Le seulementError que j'ai régulièrement utilisé dans le code commercial est ExceptionInInitializerError. Vous n'avez pas d'autre choix dans les blocs d'initialisation static. Mais même si vous le lancez dans une application web, l'application web continuerait à écouter sur les requêtes HTTP. Votre meilleur pari est de faire le chargement ou l'initialisation du module à l'intérieur d'un Filter en écoutant un url-pattern de /* et laissez le Filter bloquer les requêtes HTTP en conséquence. Par exemple.

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."); 
    } 
} 

Ceci produirait une erreur HTTP 500 avec le message donné.

1

Vous ne savez pas exactement comment mais OSGi a obtenu une gestion des dépendances de bundles (= similaire aux plugins). Un paquet ne se charge pas jusqu'à ce qu'un autre paquet soit prêt. Peut-être que vous pouvez utiliser ce même mécanisme (ou simplement utiliser OSGi lui-même;)) pour attendre un plugin/application jusqu'à ce qu'un autre plugin soit prêt. Ou vous arrêtez l'application au démarrage si elle ne peut pas trouver/charger votre plugin correctement.

+0

Semble comme le marteau de tous les ongles, mais étant friands d'OSGi, j'ai tendance à approvde. En outre, tout type de mécanisme de gestion des dépendances devrait fonctionner (IoC, vous l'appelez). – Riduidel

-1

Se connecter l'erreur, et ensuite utiliser System.exit pour quitter simplement l'application

+0

Cela ne donne aucune indication (au-delà du code de retour) indiquant pourquoi l'application a échoué. –

+0

@HotLicks J'ai ajouté une suggestion pour d'abord se connecter l'erreur, puis quitter. – Demi

Questions connexes