Sto cercando un punto di ingresso in un EJB distribuito su JBoss.Metodo di chiamata in EJB all'avvio di JBoss
Le servlet hanno il tag load-on-startup
da utilizzare nel suo web.xml
.
Sto cercando la stessa funzionalità init()
per un EJB.
Sto cercando un punto di ingresso in un EJB distribuito su JBoss.Metodo di chiamata in EJB all'avvio di JBoss
Le servlet hanno il tag load-on-startup
da utilizzare nel suo web.xml
.
Sto cercando la stessa funzionalità init()
per un EJB.
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.
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.
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")
Questo articolo descrive sette modi diversi di invocare funzionalità all'avvio del server. Tuttavia, non tutti funzioneranno con JBoss.
Seven ways to get things started. Java EE Startup Classes with GlassFish and WebLogic
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.
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. –
Grazie. Due fantastici post. Ho finito con un "ServletWrapper" invece. Ma un refactor è all'ordine del giorno. Cheers! – Elijah
Sto usando jboss 5.1 (non sono sicuro che supporti EJB3.1) Posso usare questa tecnica per invocare il metodo di distribuzione? Grazie. – rayman