2010-06-08 9 views

Répondre

25

Cela n'existait pas pour EJB jusqu'au 3.1. Avec 3.1 EJB, vous pouvez utiliser un haricot singleton pour simuler que:

De Application Startup/Shutdown Callbacks:

@Startup 
    @Singleton 
    public class FooBean { 

     @PostConstruct 
     void atStartup() { ... } 

     @PreDestroy 
     void atShutdown() { ... } 

    } 

Sinon, vous devrez compter sur le bon vieux truc pour utiliser un ServletContextInitializer.

Il existe une extension spécifique à l'application, par ex. lifecycle listener pour Glassfish. Peut-être qu'il y a une telle chose pour JBoss.

Mais si j'étais vous j'essayerais de compter autant que possible sur les fonctionnalités standard. Le problème avec l'extension non standard est que vous ne savez jamais exactement ce qui peut être fait ou non, par ex. pouvez-vous démarrer la transaction ou non, etc.

+1

Alternativement, on peut toujours utiliser un MBean avec des méthodes de cycle de vie start/stop. Le MBean est injecté avec l'EJB nécessaire et appelle toutes les méthodes qui sont nécessaires. –

+0

Merci. Deux excellents messages. Je me suis retrouvé avec un "ServletWrapper" à la place. Mais un refactor est à l'ordre du jour. À la votre! – Elijah

+0

J'utilise jboss 5.1 (je ne sais pas si elle supporte EJB3.1) Je peux utiliser cette technique pour invoquer la méthode sur le déploiement? Merci. – rayman

1

Les beans gérés peuvent être utilisés pour effectuer un processus au démarrage de JBoss, vous devez ajouter l'entrée de ce bean géré dans le fichier de configuration.

1

Vous devriez être en mesure d'ajouter la ligne suivante en haut de la méthode que vous voulez exécuter au démarrage:

@Observer("org.jboss.seam.postInitialization") 
3

Si vous ciblez JBoss AS 5.1, et vous ne faites pas attention à l'aide du JBoss EJB 3.0 Extensions, vous pouvez construire un haricot de service pour amorcer votre EJB. Si votre service implémente une interface annotée avec l'annotation @Management et déclare une méthode avec la signature public void start() throws Exception, JBoss appellera cette méthode lorsqu'il démarrera le service. Vous pouvez ensuite appeler une méthode init() dédiée à l'EJB que vous souhaitez initialiser:

@Service 
public class BeanLauncher implements BeanLauncherManagement 
{ 
    @EJB private SessionBeanLocal sessionBean; 

    @Override 
    public void start() throws Exception 
    { 
     sessionBean.init(); 
    } 
} 

@Management 
public interface BeanLauncherManagement 
{ 
    public void start() throws Exception; 
} 

Plus d'informations sur ce sujet, y compris des événements supplémentaires du cycle de vie, se trouve here.

Questions connexes