EJB3 одновременные звонки с указанием состояния от разных клиентов - PullRequest
2 голосов
/ 09 августа 2011

У меня полнофункциональное клиентское приложение 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]

Я могу заметить, что есть два разных экземпляра с состоянием (как и ожидалось, один экземпляр длякаждый клиент), и они работают в разных потоках.

Когда я использую состояние без состояния, а не с состоянием, это работает.Однако в моем приложении мне нужно сохранить некоторые данные от клиента, и состояние с сохранением состояния кажется более подходящим.

Ответы [ 2 ]

4 голосов
/ 10 августа 2011

Похоже, это ошибка, влияющая на JBoss AS 6: https://issues.jboss.org/browse/JBAS-9416

0 голосов
/ 10 августа 2011

По умолчанию EJB не допускает одновременных вызовов bean-компонентов с состоянием.Я знаю, что на сервере Weblogic вы можете включить эту функцию, используя свойство allow-concurrent-calls.В JBoss, скорее всего, вам придется переделать свою архитектуру и использовать bean-компоненты без сохранения состояния.

...