Сериализируются ли одновременные удаленные вызовы на открытом RMI компоненте jBoss EJB?

Это более подробная версия того же вопроса . спросил вчера.

У меня есть клиентское приложение, которое взаимодействует с серверным приложением через вызовы RMI для EJB без сохранения состояния. Начальный контекст строится с такими параметрами конфигурации:

InitialContext ctx = new InitialContext(new Hashtable<String, String>() {
  {
    this.put("java.naming.provider.url", "serverUrl:portNumber");
    this.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
    this.put("java.naming.factory.url", "org.jnp.interfaces.TimedSocketFactory");
  }
});

Затем прокси-сервер ищется с использованием:

ServerBean bean = (ServerBean) ctx.lookup("ejb/ServerBeanImpl");

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

Мой вопрос: эти вызовы выполняются последовательно или параллельно? Каждый удаленный вызов выполняется на сервере. Выполняется некоторое вычисление и возвращается результат. Если все вызовы будут сериализованы, мне придется ограничить количество существующих потоков, так как многие из них могут быть заблокированы на ServerBean.


person Boris Pavlović    schedule 05.11.2010    source источник
comment
Звучит как сценарий, который вы можете протестировать :-). Запустите JMeter (или напишите небольшое клиентское приложение) и посмотрите, что произойдет!   -  person Martijn Verburg    schedule 05.11.2010


Ответы (2)


Вызовы будут заблокированы контейнером как минимум на стороне сервера. Но имейте в виду, что почти все серверы приложений имеют пулы потоков для ограничения количества запросов, поэтому размер пула bean-компонентов без сохранения состояния, равный 1000, и размер пула потоков сервера, равный 100, мало что дает — ваш пул bean-компонентов без сохранения состояния никогда не превысит 100.

Итак, что нужно проверить:

  1. Существует ли пул соединений на стороне клиента и каков его размер?
  2. Существует ли пул потоков на стороне сервера и каков его размер?

Если нет пула соединений на стороне клиента и все потоки используют одно и то же соединение, вы в значительной степени ограничены, если только между клиентом и сервером не используется NIO.

Если цель состоит в том, чтобы просто делать что-то параллельно, я бы использовал поддержку метода EJB 3.1 @Asynchronous, которая поддерживает вызовы @Remote. Это даст вам максимальный параллелизм и наиболее переносимую работу, не беспокоясь о регулировании вашего собственного использования.

person David Blevins    schedule 09.11.2010

Я думаю, что использование MDB/MDP - это то, что вам нужно, если вы хотите асинхронного поведения.

person Martijn Verburg    schedule 05.11.2010