EJB пул против Spring: как управлять рабочей нагрузкой весной? - PullRequest
2 голосов
/ 27 июня 2011

Когда приложение EJB получает несколько запросов (рабочая нагрузка), оно может управлять этой рабочей нагрузкой всего лишь POOLING EJB, поэтому, когда каждый объект EJB используется потоком, следующим потокам придется ждать ставятся в очередь, пока какой-нибудь EJB не завершит работу (избегая перегрузки и снижения эффективности системы).

Spring использует синглтоны без сохранения состояния (вообще не объединяются), которые используются числом потоков, вышедших из-под контроля.

Есть ли способ сделать что-то, чтобы контролировать способ доставки рабочей нагрузки? (эквивалентно пулу экземпляров EJB).

Спасибо!

Ответы [ 3 ]

4 голосов
/ 27 июня 2011

В случае веб-приложения контейнер сервлета имеет пул потоков, которые определяют, сколько входящих HTTP-запросов он может обрабатывать одновременно. В случае POJO, управляемого сообщениями, конфигурация JMS определяет аналогичный пул потоков, обрабатывающий входящие сообщения JMS. Каждый из этих потоков получит доступ к бинам Spring.

Поиск в поиске потоков RMI выглядит так, как будто нет способа настроить пул потоков для RMI. Каждому клиенту RMI выделяется поток. В этом случае вы можете использовать среду Spring * * Task Executor для создания пула. Использование <task:executor id="executor" pool-size="10"/> в вашей контекстной конфигурации позволит установить исполнителя с 10 потоками. Затем аннотируйте методы вашего Spring bean-компонента, которые будут обрабатывать работу с @Async.

С помощью исполнителя задач Spring вы можете оставить конфигурацию пула сервлетов и JMS в одиночку и настроить пул для вашей конкретной работы в одном месте.

1 голос
/ 27 июня 2011

Чтобы добиться поведения, похожего на пул EJB, вы можете определить собственную настраиваемую область. Взгляните на SimpleThreadScope и пример, на который ссылается этот класс 'javadoc.

1 голос
/ 27 июня 2011

Разница между Spring и EJB заключается в том, что Spring допускает несколько потоков на одном экземпляре компонента, тогда как в EJB у вас есть только один шаг на компонент (в один момент времени).

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


Из комментариев:

Да, мне это нужно, если я хочу ограничитьколичество потоков, которые могут использовать мои бины одновременно

Один (, возможно, не лучший ) способ справиться с этим - реализовать приложение в обычном весеннем стиле (без ограничений).И чем есть «фронт-контроллер», который принимает запрос клиента.Но вместо того, чтобы вызывать службу напрямую, она вызывает службу asyncron (@Async).Можете ли вы использовать какой-то асинхронный прокси вместо того, чтобы делать сервис сам по себе asyncron.

class Controller{... 
  Object doStuff() {return asyncProxy.doStuffAsync().get();}
}
class AsyncProxy{... 
   @Async Future<Object> duStuffAscny{return service.doStuff();
}
class Service{... 
   Object doStuff{return new Object();}
}

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

В этом случае я бы использовал какой-нибудь фронт-контроллер, который запускает новый Async

...