Java EE façon d'assurer l'initialisation de toutes les parties de l'OREILLE


Je me demande comment il serait possible d'assurer un init d'une application complète sans avoir le problème que certains composants d'application peuvent être accessibles ou déclenchés.

Je parle des applications Java EE 6/Java EE 7, qui contiennent plusieurs composants WAR et EJB. L'application EAR contient des beans pilotés par des messages (déclenchés sans contrôle par des accès externes), des Servlets (déclenchés / accessibles sans contrôle par des utilisateurs ou des systèmes d'interface) et des TimerEJBs, qui eux-mêmes obtiennent déclenché par un calendrier défini.

Imaginez, vous devez vous assurer au démarrage de l'application EAR que les parties de l'application doivent être initialisées. Par exemple, vous exécutez des outils tels que les migrations de base de données, qui peuvent prendre des heures. Comment est-il possible en Java EE 6/Java EE 7 de contrôler qu'aucune des parties mentionnées ci-dessus de l'application ne peut même être exécutée jusqu'à ce que l'initialisation ait correctement passé l'initialisation. Et si l'initialisation échoue, pour rejeter les opérations sur les services en Java EE?

J'espère pouvoir expliquer mon problème de la bonne manière. En bref: comment puis-je exécuter le code "Init"avant qu'un autre code de mon application ne soit exécuté? Et comment puis-je éviter l'exécution de tout autre code si mon code "Init"échoue? Existe-t-il une méthode Java EE 6/Java EE 7 standard? Sinon, existe-t-il un moyen jboss7/wildfly?

Author: Arjan Tijms, 2014-07-26

1 answers

Voici comment nous l'avons fait:

Pour chaque application/service (ear ou war, faites votre choix), ayez un "startupFinished" @Startup @Singleton. ce singleton dépendra de tous les autres singletons de cette application-ce seraient ces singletons qui font tout le travail d'initialisation réel (et pour éviter les pièges avec l'initialisation paresseuse de référence, il est préférable d'appeler une méthode isInitialized() sur chacun d'eux).

Toutes les BMD d'une application dépendent de StartupFinished de cette application singleton (voir cette question pour savoir comment).

Pour les dépendances entre applications (oreilles croisées) - si A. ear dépend de B. ear, le singleton StartupFinished de A injecte le StartupFinished de B (vous devrez l'exposer en tant qu'EJB @Remote).

Encore mieux, pour le faire correctement, vous aurez besoin d'un singleton StartupStarted dans A qui dépend du StartupFinished de B - pour vraiment vous assurer que B est entièrement et complètement en place avant que A ne commence l'initialisation.

 3
Author: radai, 2017-05-23 12:28:28