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.
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
La mia esperienza è che ciò accadrà solo quando l'app è disattivata o non dispiegata o il server è spento. – perissf