我在独立环境中使用Spring 3.1。
我有创建程序化原型bean的场景。
每个bean都有自己的状态。(它们是有状态的,具有唯一的id等等。)
创建bean之后,我将它连接到一个主题(通过DLMC实用)。
发送到主题的每条消息都包含一个特定的id(主题的消费者之一)
延迟和吞吐量对我来说非常重要。
因此,如果我向特定的bean发送消息,我在每条消息之间有一个荒谬的延迟,因为该bean非常繁忙,并且在它完成当前工作之前它不会是免费的。
所以我认为每次创建它时都需要创建同一个bean的池以避免这种情况。
任何想法我怎样才能做到这一点?也许有一个高水平的解决方案?
我用这种方式实际创建那些spring mdbs:
java代码:
MyMdb myMdb= (MyMdb) beanFactory.getBean("MyMdb", id);
和xml:
<bean id="fixSessionMDB" class="com.finbird.fixgw.core.mdb.FixSessionMDB"
scope="prototype" lazy-init="true">
<constructor-arg ref="0" />
<constructor-arg ref="0" />
</bean>
答案 0 :(得分:0)
您没有提供太多的实现细节,但请查看以下代码段:
<bean id="uniqueConsumerTarget" scope="prototype" lazy-init="true"/>
<bean id="uniqueConsumer" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="targetSource">
<bean class="org.springframework.aop.target.CommonsPoolTargetSource">
<property name="targetClass" value="com.example.UniqueConsumer"/>
<property name="targetBeanName" value="uniqueConsumerTarget"/>
<property name="maxSize" value="10"/>
<property name="maxWait" value="5000"/>
</bean>
</property>
</bean>
这段代码非常聪明。每次你要求"uniqueConsumer"
bean时,Spring实际上都会返回一些拦截所有调用的动态代理。一旦你尝试在该bean上执行任何方法,Spring将从池中获取一个实例(或创建一个实例)并转发给它。
"maxSize"
和"maxWait"
参数具有自我描述性,可用于微调池。