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 を作成する場合を除いて、すべて正常に機能するため、新しいリクエストでは、常に同じオブジェクトがあります。新しいオブジェクト。
@EJB アノテーションを使用して EJB を取得すると、要求ごとに新しいオブジェクトが期待どおりに動作します。
私が学んだことは、EJB がプールで選択されたということですが、いつ破棄されるのでしょうか? JNDI ルックアップは、JSF ページのようにスコープにバインドされていないと思います。しかし、それはどのように正確に指定されていますか?