2012-03-01 15 views
10

Ho un EJB che deve essere un singleton e stateful poiché si tratta di una sorta di pool di connessioni. Le mie domande sono:@Singleton in java EJB

  • Se io definisco un EJB con @Singleton annotazione, sarà allora stateful di default o devo definire con @Stateful anche?
  • Può essere con annotazione @Stateless?

Ho provato a trovare qualche documentazione su questo, ma finora non ho avuto fortuna, quindi chiunque abbia conoscenze per favore condividi la tua saggezza e forse un link o due.

risposta

13

L'EJB tutorials mostra che un EJB può essere Singleton o Stateful o Stateless. Non ho mai provato a usare più di una di queste annotazioni, ma sono abbastanza convinto che la cosa giusta da fare è usare solo una di queste.

Da quel link:

Singleton bean di sessione mantenere il loro stato tra client invocazioni

Quindi, alla sua domanda:

se mi definisco un EJB con @Singleton l'annotazione sarà quindi di stato per impostazione predefinita o devo definirlo anche con @Stateful?

Se per Stateful si intende la capacità di mantenere il proprio stato, la risposta è: sì, un Singleton sarà Stateful per impostazione predefinita.

Tenere presente che ci sono alcune situazioni particolari in cui un Singleton non si comporta come un Singleton, leggere questo article su questo. In genere, non si esegue questo tipo di rischio se si è all'esterno di un cluster ed è impossibile utilizzare il costruttore predefinito: è necessario utilizzare sempre i riferimenti di un EJB immettendolo in un altro EJB o in un client Web utilizzando:

@EJB MyEJB myEJB; 

Infine, dare un'occhiata alla parte this del tutorial Java EE 6, sul ciclo di vita degli EJB, spiegando che la principale differenza tra Stateful e altri EJB è la possibilità di essere passivati ​​dal contenitore durante la sua vita. Questa differenza è la ragione principale per cui l'affermazione "a Singleton è Stateful per impostazione predefinita" non è corretta in senso stretto, ma è corretta nel contesto della domanda.

+0

Grazie per alcune buone linee guida. Sono un po 'preoccupato perché dice nel tutorial di Java EE 6: "Alla fine del ciclo di vita, il contenitore EJB chiama il metodo annotato @PreDestroy, se esiste. Il bean di sessione singleton è ora pronto per la garbage collection. " Questo accadrà solo quando chiudo il mio server delle applicazioni o altrimenti? – Marthin

+1

La mia esperienza è che ciò accadrà solo quando l'app è disattivata o non dispiegata o il server è spento. – perissf