Как использовать бобы Pooled Spring вместо синглтоновых? - PullRequest
2 голосов
/ 27 июня 2011

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

Я нашел здесь (весенняя документация) способ добиться этого путем объединения компонентов в стиле EJB, выполнив следующее:

  • Объявите целевой бин как область действия "prototype".
  • Объявите провайдера пула, который будет поставлять ограниченное количество объединенных "целевых" экземпляров.
  • Объявите «ProxyFactoryBean», функция которого мне не понятна.

Вот объявление этого боба:

<bean id="businessObjectTarget" class="com.mycompany.MyBusinessObject" 
    scope="prototype">
  ... properties omitted
</bean>

<bean id="poolTargetSource" class="org.springframework.aop.target.CommonsPoolTargetSource">
  <property name="targetBeanName" value="businessObjectTarget"/>
  <property name="maxSize" value="25"/>
</bean>

<bean id="businessObject" class="org.springframework.aop.framework.ProxyFactoryBean">
  <property name="targetSource" ref="poolTargetSource"/>
  <property name="interceptorNames" value="myInterceptor"/>
</bean>

Моя проблема заключается в том, что, когда я объявлю другой компонент для использования объединенных экземпляров "businessObjectTarget", как мне это сделать? Я имею в виду, когда я пытаюсь сделать что-то вроде этого:

<bean id="clientBean" class="com.mycompany.ClientOfTheBusinessObject">
  <property name="businessObject" ref="WHAT TO PUT HERE???"/>
</bean>

Каким должно быть значение "ref" ??

Ответы [ 4 ]

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

Вы не можете использовать свойства для получения экземпляров прототипов.
Один из вариантов - использовать методы поиска (см. , глава 3.3.7.1 )
Другой вариант, чтобы получить ваш компонент в коде: makeваш com.mycompany.ClientOfTheBusinessObject для реализации интерфейса ApplicationContextAware и затем вызовите context.getBean("clientBean")

0 голосов
/ 16 ноября 2015

Обратите внимание на имя третьего компонента в весеннем примере: - "businessObject"

Это означает, что это bean-компонент, из которого вы должны получить доступ к общему пулу.

Для вашего случая, если вам нужен собственный клиентский бин, вы можете получить его следующим образом. Но в таком случае businessObject не требуется. :-

<bean id="businessObjectTarget" class="com.mycompany.MyBusinessObject" 
    scope="prototype">

  ... properties omitted
</bean>

<bean id="poolTargetSource" class="org.springframework.aop.target.CommonsPoolTargetSource">
  <property name="targetBeanName" value="businessObjectTarget"/>
  <property name="maxSize" value="25"/>
</bean>

<bean id="clientBean" class="com.mycompany.ClientOfTheBusinessObject">
 <property name="poolTargetSource" ref="poolTargetSource"/>
</bean>


Java classes:-
public class ClientOfTheBusinessObject{
     CommonsPoolTargetSource poolTargetSource;
//<getter and setter for poolTargeTSource>
  public void methodToAccessCommonPool(){
     //The following line gets the object from the pool.If there is nothing left in the pool then the thread will be blocked.(The blocking can be replaced with an exception by changing the properties of the CommonsPoolTargetSource bean)
     MyBusinessObject mbo = (MyBusinessObject)poolTargetSource.getTarget();
     //Do whatever you want to do with mbo
     //the following line puts the object back to the pool
     poolTargetSource.releaseTarget(mbo);
  }
}
0 голосов
/ 05 мая 2013

Я использовал java-конфигурацию для создания прокси через интерфейс, который обрабатывает пулы с использованием apache commons-pool для достижения уровня вызовов-вызовов.

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

Я почти уверен, что вы можете ограничить количество одновременных потоков менее сложным способом. Вы смотрели на API параллелизма Java, в частности на Executors.newFixedThreadPool ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...