1

シナリオ:

手動ルックアップによってBeanを生成するメソッドがあります@Singleton UserFactory(可能性があります)。@StatelesscreateSession()@Stateful UserSession

DIで注入している場合、メソッド@EJBの呼び出し中に同じインスタンスを取得しますfromFactory()(そうあるべきです)

私が欲しいのは、UserSessionルックアップを実行せずにの新しいインスタンスを取得することです。

@StatefulQ1:セッションBeanの新しいインスタンスを呼び出すにはどうすればよいですか?

コード:

@Singleton
@Startup
@LocalBean
public class UserFactory {

    @EJB
    private UserSession session;

    public UserFactory() {
    }


    @Schedule(second =  "*/1", minute = "*", hour = "*")
    public void creatingInstances(){
        try {
            InitialContext ctx = new InitialContext();
            UserSession session2 = (UserSession) ctx.lookup("java:global/inferno/lic/UserSession");
            System.out.println("in singleton UUID " +session2.getSessionUUID());    
        } catch (NamingException e) {
            e.printStackTrace();
        }

    }

    @Schedule(second =  "*/1", minute = "*", hour = "*")
    public void fromFactory(){
        System.out.println("in singleton UUID " +session.getSessionUUID());
    }


    public UserSession creatSession(){
        UserSession session2 = null;
        try {
            InitialContext ctx = new InitialContext();
            session2 = (UserSession) ctx.lookup("java:global/inferno/lic/UserSession");
            System.out.println("in singleton UUID " +session2.getSessionUUID());
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return session2;

    }



}

私が理解しているように、

session.getClass().newInstance();

最善のアイデアではありません

Q2:本当ですか?


アップデート

目標

実際の目標は、ユーザーのセッションを管理するSessionsFactoryを作成することです(これはWebサービスユーザーです)。

セッション@StatefullBean:

@Stateful
//Destroying outomaticly after 30 minuts inactive
@StatefulTimeout(180000)
@LocalBean
public class UserSession {
    //represent creation time, used by scheduler for destroying session
    private GregorianCalendar creationDate;
    private UUID sessionUUID;
    private String userId;
    private String state;

    //TODO change to xml
    private String histrory;

    public UserSession() {
    }
    @PostConstruct
    private void initSession(){
        //getting construction date
        creationDate = (GregorianCalendar) Calendar.getInstance();
        //generationg session id
        sessionUUID = UUID.randomUUID();
    }

    @PreDestroy
    private void releaseResource(){
        creationDate =null;
        sessionUUID = null;
        userId =null;
    }

    @Remove
    public void destroySession(){

    }

    public UUID getSessionUUID() {
        return sessionUUID;
    }

    public GregorianCalendar getCreationDate() {
        return creationDate;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getHistrory() {
        return histrory;
    }

    public void addHistroryEntry(String entry) {
        //TODO add history entry

    }
}

ファクトリメソッドでは、@ Statefull UserSessionの新しいインスタンスを作成し、ユーザーごとに作成されたセッションの数を管理し、一定期間(30分)後にdestroySession()を呼び出します。

ユーザーのセッションリクエストの履歴を追跡する必要があり、後で履歴を保持します。

したがって、@StatefullBeanは私のニーズに対応する必要があると思います。しかし、JNDI名によるルックアップは、新しいejbが作成される唯一のチャンスであるように見えます。ルックアップなしでejbの新しいインスタンスを挿入する可能性を探してい
ます。また、マップ/コレクションにthrmを保持する代わりに、@StatefullUserSessionの現在作成されているインスタンスのコレクションを取得する可能性を探しています。

Q3:そうです..JNDIだけがejbの新しいインスタンスを作成するのに役立ちますか?

Q4:コンテナからいくつかのejb`sインスタンスのコレクションを取得することは可能ですか?


Glassfish v3、ejb3.1を使用しています。

4

1 に答える 1

0

Q1:@StatefulセッションBeanの新しいインスタンスを呼び出すにはどうすればよいですか?

複数の同時クライアントによって共有される可能性のあるステートレスセッションBeanやサーブレットなどのステートレスオブジェクトにステートフルセッションBeanを挿入しないでください。代わりに、JNDIを使用する必要があります。限目。

正直なところ、私はあなたが何をしているのかよくわかりませんし、ステートフルセッションBeanの削除などの重要な手順もわかりません。メモリを節約するためにインスタンスを非アクティブ化/アクティブ化しようとするコンテナとして、メモリが不足するか、大量のディスクIOが発生する可能性があります。

Q2:本当ですか?

呼び出すことはできnewますが、単純なJavaクラス以外のものを取得することを期待しないでください。つまり、管理対象オブジェクトを取得することを期待しないでください。つまり、EJBを取得することを期待しないでください。これはあなたが望むものではないと思います。


これがあまり役に立たない場合は申し訳ありませんが、私が言ったように、私はあなたが何を達成しようとしているのか本当に理解していません。あなたはおそらく最初にあなたの目標を説明し始めるべきです、私はあなたが正しい道を進んでいるとは感じていません。

于 2010-05-09T19:42:56.083 に答える