0

我正在编写关于 JBOSS AS 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");
    }
}

然后我在 JSF ManagedBean 中通过 JNDI 调用 EJB:

@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);
    }
}

然后我用 JSF 显示 CitationEJB.getCitation()。一切正常,除了当我发出 F5 和一个新请求时,我总是有相同的对象:当我使用 CitationEJB.setCitation("Hello toto"),然后是 F5 时,我确实有 "Hello Toto" 而不是品牌新对象。

当我使用 @EJB 注释来获取 EJB 时,我对每个请求都有一个新对象的预期行为。

所以我学到的是 EJB 是在池中挑选的,但它什么时候被销毁?我猜想 JNDI 查找不像 JSF 页面那样绑定到范围。但它是如何准确指定的?

4

1 回答 1

1

无状态会话 Bean 的生命周期由容器管理。部署 EJB 时,将创建多个实例并将其放置在实例池中(例如,JBoss 6 默认创建 10 个实例)。该数字可以根据需求放大或缩小。EJB 通常不会在使用后销毁,而是放回池中以反复使用。

对于您想要保持状态的应用程序,Stateful Session Bean 将是正确的选择(或者如果您想在实例之间共享状态,则为 Single Session Bean)。使用有状态会话 Bean,应用程序可以通过使用 @Remove 注释方法来破坏 EJB。

于 2013-04-20T06:24:22.700 回答