シナリオ:
手動ルックアップによってBeanを生成するメソッドがあります@Singleton UserFactory
(可能性があります)。@Stateless
createSession()
@Stateful UserSession
DIで注入している場合、メソッド@EJB
の呼び出し中に同じインスタンスを取得しますfromFactory()
(そうあるべきです)
私が欲しいのは、UserSession
ルックアップを実行せずにの新しいインスタンスを取得することです。
@Stateful
Q1:セッション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を使用しています。