2010-06-08 12 views

risposta

25

Questo non esisteva per EJB fino al 3.1. Con EJB 3.1 è possibile utilizzare un fagiolo Singleton per simulare che:

Da Application Startup/Shutdown Callbacks:

@Startup 
    @Singleton 
    public class FooBean { 

     @PostConstruct 
     void atStartup() { ... } 

     @PreDestroy 
     void atShutdown() { ... } 

    } 

In caso contrario, sarà necessario fare affidamento sul buon vecchio trucco di usare un ServletContextInitializer.

Esistono alcune estensioni specifiche per l'applicazione, ad es. lifecycle listener per Glassfish. Forse c'è una cosa del genere per JBoss.

Ma se fossi in te, proverei a fare affidamento sulle funzionalità standard il più possibile. Il problema con l'estensione non standard è che non sai mai esattamente cosa può essere fatto o meno, ad es. puoi avviare la transazione o no, ecc.

+1

In alternativa, è sempre possibile utilizzare un MBean con i metodi di avvio/arresto del ciclo di vita. L'MBean viene iniettato con l'EJB necessario e chiama qualsiasi metodo da esso richiesto. –

+0

Grazie. Due fantastici post. Ho finito con un "ServletWrapper" invece. Ma un refactor è all'ordine del giorno. Cheers! – Elijah

+0

Sto usando jboss 5.1 (non sono sicuro che supporti EJB3.1) Posso usare questa tecnica per invocare il metodo di distribuzione? Grazie. – rayman

1

I bean gestiti possono essere utilizzati per eseguire alcuni processi all'avvio di JBoss, devi aggiungere la voce di quel bean gestito nel file di configurazione.

1

Si dovrebbe essere in grado di aggiungere la seguente riga alla parte superiore del metodo che si desidera eseguire all'avvio:

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

Se ci si rivolge JBoss AS 5.1, e non ti dispiace utilizzando il JBoss EJB 3.0 Extensions, si può costruire un fagiolo di servizio per l'avvio il vostro EJB. Se il servizio implementa un'interfaccia annotata con l'annotazione @Management e dichiara un metodo con la firma public void start() throws Exception, JBoss chiamerà questo metodo all'avvio del servizio. È quindi possibile chiamare un metodo di init() dedicato sul EJB che si desidera inizializzare:

@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; 
} 

Ulteriori informazioni su questo, compresi gli eventi del ciclo di vita aggiuntivi, si possono trovare here.