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 を作成する場合を除いて、すべて正常に機能するため、新しいリクエストでは、常に同じオブジェクトがあります。新しいオブジェクト。

@EJB アノテーションを使用して EJB を取得すると、要求ごとに新しいオブジェクトが期待どおりに動作します。

私が学んだことは、EJB がプールで選択されたということですが、いつ破棄されるのでしょうか? JNDI ルックアップは、JSF ページのようにスコープにバインドされていないと思います。しかし、それはどのように正確に指定されていますか?

4

1 に答える 1

1

ステートレス セッション Bean のライフサイクルは、コンテナーによって管理されます。EJB がデプロイされると、多数のインスタンスが作成され、インスタンス プールに配置されます (たとえば、JBoss 6 はデフォルトで 10 個のインスタンスを作成します)。数は、需要に基づいて拡大または縮小できます。通常、EJB は使用後に破棄されるのではなく、プールに戻されて何度も使用されます。

状態を保持したいアプリケーションの場合、ステートフル セッション Bean が適切な選択です (インスタンス間で状態を共有する場合は、単一セッション Bean)。ステートフル セッション Bean を使用すると、アプリケーションはメソッドに @Remove アノテーションを付けることで EJB を破棄できます。

于 2013-04-20T06:24:22.700 に答える