Una citazione dai chicchi EJB 3.1 spec
4,7 Stateless Session
bean di sessione senza sono i bean di sessione le cui istanze hanno alcuna conversazione Stato. Ciò significa che tutte le istanze di bean sono equivalenti quando non sono coinvolte nella manutenzione di un metodo richiamato dal client.
Il termine "stateless" indica che un'istanza non ha stato per un client specifico. Tuttavia, le istanze dell'istanza dell'istanza possono contenere lo stato tra le chiamate di metodo richiamate dal client.
Esempi di tale stato includono una connessione di database aperta e un riferimento a un oggetto bean enterprise.
L'enfasi è su senza stato di conversazione. Possono avere uno stato "altro".
Per esempio, ho usato per controllare se il carico è stato diffuso equamente su tutte le istanze in un nodo di cluster:
@Stateless(name = "DemoPingSb")
@Remote(DemoPingSbIfc.class)
public class DemoPingSb implements Serializable, DemoPingSbIfc {
private final AtomicInteger instancePingCount = new AtomicInteger(0);
private final static AtomicInteger classPingCount = new AtomicInteger(0);
public DemoPingSb() {
super();
}
public String ping(final String s) {
final int local = this.instancePingCount.incrementAndGet();
final int global = classPingCount.incrementAndGet();
System.out.println("INFO: local " + local + ", global " + global
+ ", s " + s);
return s.toUpperCase();
}
}
e se c'è abbastanza carico:
13: 13: 21.769 INFO [stdout] (http-localhost-127.0.0.1-8080-1) INFO: locale 22, globale 22, ciao
13: 13: 21,936 INFO [stdout] (http-localhost-127.0. 0.1-8080-1) INFO: locale 1, globale 23, ciao
Quindi ci sono alcuni casi particolari in cui questa funzione potrebbe essere utile.
Osservazioni
- La specifica parla di variabili di istanza; l'utilizzo di variabili statiche non è coperto qui. Quindi il codice potrebbe non essere corretta in riferimento
classPingCount
- L'utilizzo di un
AtomicInteger
per instancePingCount
potrebbe da sostituiti con volatile int
, perché (4.10.13)
Il contenitore deve garantire che solo un thread può essere in esecuzione una istanza di bean di sessione stateless o stateful in qualsiasi momento.
- un session bean stateless non viene mai passivato (4,2)
Definire "variabile globale"; Lo chiedo perché non è un termine Java standard e può significare cose diverse per persone diverse. –