EJB3 одновременные вызовы с отслеживанием состояния от разных клиентов

У меня есть богатое клиентское приложение 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, это работает. Однако в моем приложении мне нужно сохранить некоторые данные от клиента, и отслеживание состояния кажется более подходящим.


person r0drigopaes    schedule 09.08.2011    source источник


Ответы (2)


Похоже, что это ошибка JBoss AS 6: https://issues.jboss.org/browse/JBAS-9416

person Marcio Aguiar    schedule 10.08.2011

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

person omnomnom    schedule 10.08.2011
comment
Проблема в том, что он не должен разрешать одновременные вызовы ОДНОГО ЭКЗАМЕНА SFSB, и в журнале четко отображаются два отдельных экземпляра. - person Marcio Aguiar; 10.08.2011
comment
Пиотрек, я понял, что это ограничение применяется только при одновременных вызовах одного и того же экземпляра компонента. Кроме того, сервер создает разные экземпляры состояния для каждого клиента. Затем, поскольку мы выполняем одновременные вызовы различных экземпляров bean-компонентов с отслеживанием состояния, я ожидал, что сервер будет обрабатывать оба запроса одновременно. - person r0drigopaes; 10.08.2011
comment
Из спецификации: ... Если вызываемый клиентом бизнес-метод выполняется в экземпляре, когда другой вызываемый клиентом вызов, от того же или другого клиента, прибывает в ТО ЖЕ ЭКЗЕМПЛЯР СТАТИЧЕСКОГО КЛАССА БИНА, если второй клиент является клиент бизнес-интерфейса компонента, одновременный вызов может привести к тому, что второй клиент получит исключение javax.ejb.ConcurrentAccessException - person r0drigopaes; 10.08.2011
comment
извините, я не понял, что ваш вопрос касается разных случаев - моя вина. - person omnomnom; 11.08.2011