リモートステートフルejbを呼び出すリッチクライアントスイングアプリケーションがあります。JBoss6.0を使用しています。
クライアントを2つの異なるマシン、つまり異なるIPアドレス、jvmなどにデプロイしました。
ステートフルには次のコードがあります。
@Stateful
public class MyStateful implements MyStatefulRemote{
public void test(){
System.out.println(this);
System.out.println(Thread.currentThread());
System.out.println(Thread.currentThread().getThreadGroup());
// cpu intensive task
String value = "";
for (int j = 0; j < Integer.MAX_VALUE; j++) {
value = "" + j;
}
}
そして、クライアントには次のコードがあります。
...
String JNDI_FACADE = "MyStateful/remote";
InitialContext context = new InitialContext();
MyStatefulRemote my = (MyStatefulRemote) context.lookup(JNDI_FACADE);
my.test();
次に、最初のクライアントを実行すると、ejbはprintlnコマンドを実行し、ループの実行を開始します(予想どおり)。ただし、別のマシンで2番目のクライアントを実行すると、最初のメソッドの呼び出しが終了するまでejbは何も出力しません。つまり、ステートフルBeanは、異なるクライアントからの同時呼び出しを処理できなかったようです。
printlnコマンドを見ると、次のことがわかります。
br.com.alta.MyStateful@61ef35
WorkerThread#6[192.168.7.58:54271]
java.lang.ThreadGroup[name=jboss,maxpri=10]
サーバーが最初の呼び出しの実行を終了すると、2番目の呼び出しは出力を出力します。
br.com.alta.MyStateful@17539b3
WorkerThread#1[192.168.7.53:54303]
java.lang.ThreadGroup[name=jboss,maxpri=10]
ステートフルには2つの異なるインスタンスがあり(予想どおり、クライアントごとに1つのインスタンス)、それらは異なるスレッドで実行されていることがわかります。
ステートフルではなくステートレスを使用すると、機能します。ただし、私のアプリケーションでは、クライアントからのデータを保持する必要があり、ステートフルの方が適しているようです。