我正在编写关于 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 页面那样绑定到范围。但它是如何准确指定的?