Сериализованы ли параллельные удаленные вызовы на RMI, выставленном в jBoss EJB? - PullRequest
2 голосов
/ 05 ноября 2010

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

У меня есть клиентское приложение, которое связывается с серверным приложением через вызовы 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.

Ответы [ 2 ]

1 голос
/ 10 ноября 2010

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

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

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

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

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

0 голосов
/ 05 ноября 2010

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

...