0

我在独立环境中使用 Spring 3.1。

我有创建编程原型 bean 的场景。

每个 bean 都有自己的状态。(它们是有状态的,具有唯一的 id 等。)

创建 bean 后,我将它连接到一个主题(通过 DLMC 务实)。

发送到主题的每条消息都包含一个特定的 id(主题的消费者之一)

延迟和吞吐量对我来说非常重要。

因此,如果我将大量消息发送到特定的 bean,我会在每条消息之间出现可笑的延迟,因为该 bean 非常忙,并且在完成当前工作之前它不会空闲。

所以我认为我每次第一次创建它时都需要创建同一个bean的池以避免这种情况。

有什么想法可以实现吗?也许有一个高级解决方案?

我正在以这种方式务实地创建那些弹簧 mdb:

爪哇代码:

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>
4

1 回答 1

0

You aren't providing too many implementation details, but have a look at the following code snippet:

<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>

This code is pretty clever. Every time you ask for "uniqueConsumer" bean, Spring will actually return some dynamic proxy that will intercept all calls. Once you try to execute any method on that bean, Spring will take one instance from the pool (or create new one) and forward to it.

"maxSize" and "maxWait" parameters are self-descriptive and are used to fine-tune the pool.

于 2012-10-16T18:19:02.060 回答