2012-01-31 19 views
6

sapevo fagioli stateful mantengono sessione di conversazione tra diverse chiamata al metodo esempio, ma senza stato domanda volontà not.My, assumere ho un'implementazione bean senza stato come qui di seguitoDifferenza tra Stateless e Stateful session bean

import javax.ejb.Stateful; 
import javax.ejb.Stateless; 

import com.tata.ejb3.data.HelloEJBInterface; 

@Stateless 
public class ValueEJB implements ValueEJBInterface{ 

    private int value; 
    @Override 
    public int getValue() { 
     return this.value; 
    } 

    @Override 
    public void setValue(int value) { 
     this.value = value; 
    } 
} 

ho il mio client di fagioli (a servlet) che avvia l'invocazione di fagioli, come di seguito

@EJB(mappedName="E/ValueEJB /remote") 
ValueEJBInterface value; 

.... 

value.setValue(250); 
System.out.println(value.getValue());//This statement prints the value 250 

.... 

Secondo la mia comprensione come il mio fagiolo è bean senza stato non dovrebbe visualizzato con il valore 250.

012.

valore int privato; è una variabile istantanea, se un metodo stateless imposta il suo valore, il valore sarà scaduto sul metodo exit.Ma qui, sono in grado di ottenere il valore '250' anche tramite la mia seconda chiamata al metodo. È una violazione del concetto di apolide? Mi manca qualcosa?

risposta

2

Interessante domanda e in fondo hai perfettamente ragione. Ho fatto alcune ricerche e il consiglio generale è: "Aspettatevi che il vostro bean dimentichi tutto dopo ogni chiamata di metodo ..." (page 81). Inoltre, secondo questa risorsa, l'algoritmo responsabile per il mantenimento dello stato di Bean Session Stateless è specifico per container/fornitore. Quindi il contenitore può scegliere di distruggere, ricreare o cancellare l'istanza dopo l'esecuzione del metodo.

È possibile creare un test multi-thread e vedere come si comporta con i client multpile.

+0

Okay.You sono right.if non mi sbaglio, lo scenario simile si comportava in modo diverso in EJB2.0/Weblogic EJB container, in cui il mio cliente EJB ottenuto 0 come getValue, significa per la mia prossima chiamata, contenitore servito con una diversa istanza di ejb. – ASChakkalakal

2

Non vi è alcuna violazione di alcun concetto. È perché la stessa istanza di bean viene selezionata dal contenitore dal pool per servire altre richieste.

I bean stateless sono raggruppati & pertanto hanno un vantaggio in termini di prestazioni rispetto a bean con stato, anche il loro scopo principale è l'elaborazione senza mantenere alcun stato.

I dati sensibili o specifici dell'utente non devono essere memorizzati in variabili di istanza di bean privi di stato. Dovrebbero essere ampiamente utilizzati per elaborare i dati senza alcuna considerazione dello stato.

Può riferire here per i loro eventi del ciclo di vita gestiti dal contenitore.

+0

Grazie per i dettagli. Un'altra domanda qui. @stateless (mappedName = "XXX"), il mio ejb dovrebbe essere indirizzato tramite XXX qui dopo? Ho visto JBoss AS dato un mapping JNDI diverso nonostante XXX.È puramente specifico del venditore? – ASChakkalakal

+0

No, mappedName è un attributo opzionale e viene lasciato al fornitore, JBoss estrae questo attributo e utilizza la propria convenzione. –

+0

Ho notato una cosa più interessante, mappedName è preso solo quando la mia interfaccia di servizio era Remote interface. Quando ho specificato mappedName per un EJB la cui interfaccia di servizio ha annotato @Local (o non ho nemmeno specificato nulla qui), il mio contenitore JBoss lo ha ignorato e legato con il proprio JNDI, qualcosa come xxxxx/Local – ASChakkalakal

5

Differenza tra comportamento v Stateless v quando si chiamano metodi diversi.


STATEFUL: quando si chiamano metodi diversi su un bean stateful, vengono create diverse istanze bean.

((MyStatefulBeanRemote) ctx.lookup("ejb/MyStatefulBean")).doingStatefulThing(); 

((MyStatefulBeanRemote) ctx.lookup("ejb/MyStatefulBean")).doingNothingStatefulThing(); 

***Output: Note the creation of separate objects.*** 

INFO: Calling doingStatefulThing...com.myeclipseide.ejb3.stateful.**[email protected]** 

INFO: Calling doingNothingStatefulThing...com.myeclipseide.ejb3.stateful.**[email protected]** 

STATELESS: Quando si chiama metodi diversi su un bean senza stato, i fagioli sono messe in comune, da cui vengono create nuove istanze del fagiolo.

((MyStatelessBeanRemote) ctx.lookup("ejb/MyStatelessBean")).doSomething(); 

((MyStatelessBeanRemote) ctx.lookup("ejb/MyStatelessBean")).doNothing(); 

***Output: Note the reuse of he bean object.*** 

INFO: Doing something ...com.myeclipseide.ejb3.stateless.**[email protected]** 

INFO: Doing Nothing ...com.myeclipseide.ejb3.stateless.**[email protected]** 
Problemi correlati