2013-04-15 111 views
0

我對EJB的JBoss上寫的課程或7,我有一些麻煩。 我有一個簡單的本地無狀態EJB:無狀態調用EJB不會改變

@Stateless 
public class CitationEJB { 

    String citation ="Hello Citation"; 

    public String getCitation(){ 
     System.out.println("getting citation from :"+this.toString()); 
     return this.citation; 
    } 

    public void setCitation(String citation) { 
     System.out.println("changing citation to : "+citation); 
     this.citation = citation; 
    } 

    @PostConstruct 
    public void sayHello(){ 
     System.out.println("Hello, I'm a new EJB"); 
    } 
} 

然後,我通過調用一個JNDI EJB在JSF ManagedBean:

@ManagedBean 
@SessionScoped 
public class CitationBean { 

    //@EJB trying this time with JNDI 
    CitationEJB ejb; 

    public String getCitation() throws NamingException{ 
     ejb = lookupCitationEJB(); 
     return ejb.getCitation(); 
    } 

    public String getCitation2() throws NamingException{ 
     ejb.setCitation("hello Toto"); 
     CitationEJB ejb = lookupCitationEJB(); 
     return ejb.getCitation(); 
    } 

    private static CitationEJB lookupCitationEJB() throws NamingException { 
     Hashtable jndiProperties = new Hashtable(); 
     jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
     Context context = new InitialContext(jndiProperties); 
     String jndiName = "java:global/CitationsDyn/CitationEJB!com.citations.ejb.CitationEJB"; 
     //jndiName = "java:app/CitationsDyn/CitationEJB"; // Works also 
     return (CitationEJB) context.lookup(jndiName); 
    } 
} 

那麼我告訴了CitationEJB.getCitation()的JSF。當我把F5,等新的要求,我總是有相同的目標,一切工作只是罰款:當我用CitationEJB.setCitation(「你好TOTO」),然後F5,我有「你好託託」,而不是一個品牌新對象。

當我使用@EJB註釋,以獲得EJB,我有一個爲每個請求的新對象的預期行爲。

所以我所學到的是,EJB是在游泳池回升,但是當它被破壞?我猜測JNDI查找不像JSF頁面那樣綁定到Scope。但是,它是如何精確指定的?

+0

http://stackoverflow.com/questions/14200552/stateless-ejb3-bean-invoked-from-request-scoped-jax-rs-web-service-accumulates-s/14201781#14201781我認爲你的問題是措辭不同,但我相信答案適用。 –

回答

1

無狀態會話bean的生命週期由容器管理。當部署EJB時(例如,JBoss 6默認創建10個實例),將創建許多實例並將其放置在實例池中。這個數字可以根據需求進行放大或縮小。 EJB在使用後通常不會被破壞,而是重新放入池中以便一次又一次地使用。

對於您的應用程序,你想保持狀態,有狀態會話Bean將是正確的選擇(或單個會話Bean,如果你想在實例之間共享狀態)。通過一個有狀態會話Bean,應用程序可以通過使用@Remove註釋一個方法來使EJB失去它。