У меня полнофункциональное клиентское приложение Swing, вызывающее удаленный ejb с отслеживанием состояния.Я использую JBoss 6.0.
Я развернул клиент на двух разных машинах, т.е. на разных ip-адресах, jvms и т. Д.
У Stateful есть следующий код:
@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]
Я могу заметить, что есть два разных экземпляра с состоянием (как и ожидалось, один экземпляр длякаждый клиент), и они работают в разных потоках.
Когда я использую состояние без состояния, а не с состоянием, это работает.Однако в моем приложении мне нужно сохранить некоторые данные от клиента, и состояние с сохранением состояния кажется более подходящим.