2013-04-15 91 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失去它。