public class Test1(){
public vod method1(){
try{
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, EJB_JNDI_FACTORY);
env.put(Context.PROVIDER_URL, EJB_URL);
InitialContext ctx = new InitialContext(env);
LogSearchRemote logSearchRemote = (LogSearchRemote) ctx.lookup(LOG_SEARCH_EJB_BINDNAME);
System.out.println("logSearchRemote = " + logSearchRemote);
logSearchRemote.setTest(5);
System.out.println("logSearchRemote.getTest() = " + logSearchRemote.getTest());
System.out.println("logSearchRemote.getTestAgain() = " + logSearchRemote.getTestAgain());
LogSearchRemote logSearchRemote2 = (LogSearchRemote) ctx.lookup(LOG_SEARCH_EJB_BINDNAME);
System.out.println("logSearchRemote2 = " + logSearchRemote2);
System.out.println("logSearchRemote2.getTest() = " + logSearchRemote2.getTest());
System.out.println("logSearchRemote2.getTestAgain() = " + logSearchRemote2.getTestAgain());
this.session = session;
session.setAttribute("LogSearchEJB", logSearchRemote);
System.out.println("logSearchRemote = " + logSearchRemote);
}catch(Exception e){
e.printStackTrace();
}
// if @stateless, throw exception "$Proxy53 cannot be cast to hk.gov.ehr.service.tch.als.admin.logsearch.ejb.LogSearchRemote"
// if @stateful, no error!!
LogSearchRemote logSearchRemote = (LogSearchRemote)session.getAttribute("LogSearchEJB");
//.....
}
}
1) 上記のコードの場合、LogSearchRemote 実装 Bean がステートフルである場合、
LogSearchRemote logSearchRemote = (LogSearchRemote)session.getAttribute("LogSearchEJB");
エラーはありませんが、LogSearchRemote 実装 Bean がステートレスの場合、例外「$Proxy53 は hk.gov.ehr.service.tch.als.admin.logsearch.ejb.LogSearchRemote にキャストできません」がスローされます。なぜですか?
2)ステートフル セッション Bean の場合、毎回
LogSearchRemote logSearchRemote = (LogSearchRemote) ctx.lookup(LOG_SEARCH_EJB_BINDNAME);
異なるlogSearchRemote 実装 Bean を返します
が、ステートレスセッション Bean の場合は、毎回
LogSearchRemote logSearchRemote = (LogSearchRemote) ctx.lookup(LOG_SEARCH_EJB_BINDNAME);
同じ豆を返す!!
なぜこの場合ですか?
ステートレス セッション Bean は状態を保持すべきではなく、各ルックアップは異なる実装 Bean を返す必要があると思います。
@Stateless(name = "AlsAdminLogSearch_1_0", mappedName = "ejb/AlsAdminLogSearch_1_0")
public class LogSearchBean implements LogSearchRemote{
private int test;
@Override
public void setTest(int value){
test = value;
}
@Override
public int getTest(){
return test;
}
@Override
public int getTestAgain(){
return test;
}
//...methods
}
3) 電話したら
logSearchRemote.setTest(5);
System.out.println("logSearchRemote.getTest() = " + logSearchRemote.getTest());
System.out.println("logSearchRemote.getTestAgain() = "
logSearchRemote.getTestAgain());
ステートレス セッション Bean の場合、getTest() および getTestAgain() は、前のメソッド呼び出しでインスタンス変数「test」を記憶できます!!
なぜ覚えているのでしょうか?ステートレス セッション Bean は、メソッド呼び出しごとに異なる EJB インスタンスを呼び出すことは想定されていませんか?