У меня есть богатое клиентское приложение Swing, вызывающее удаленный ejb с отслеживанием состояния. Я использую JBoss 6.0.
Я развернул клиент на двух разных машинах, то есть с разными IP-адресами, jvms и т. Д.
Состояние имеет следующий код:
@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 и начинает выполнять цикл (как и ожидалось). Однако, когда я запускаю второго клиента на другом компьютере, ejb ничего не печатает, пока не завершится вызов первого метода. Другими словами, похоже, что bean-компонент с отслеживанием состояния не может обрабатывать одновременные вызовы даже от разных клиентов.
Если мы посмотрим на команды println, мы увидим:
br.com.alta.MyStateful@61ef35
WorkerThread#6[192.168.7.58:54271]
java.lang.ThreadGroup[name=jboss,maxpri=10]
и когда сервер завершает выполнение первого вызова, тогда второй вызов распечатывает вывод:
br.com.alta.MyStateful@17539b3
WorkerThread#1[192.168.7.53:54303]
java.lang.ThreadGroup[name=jboss,maxpri=10]
Я могу заметить, что есть два разных экземпляра с отслеживанием состояния (как и ожидалось, по одному экземпляру для каждого клиента), и они работают в разных потоках.
Когда я использую stateless вместо stateful, это работает. Однако в моем приложении мне нужно сохранить некоторые данные от клиента, и отслеживание состояния кажется более подходящим.