0

スタンドアロン環境でSpring3.1を使用しています。

プログラムによるプロトタイプBeanを作成しているシナリオがあります。

各Beanには独自の状態があります(ステートフルであり、一意のIDなどがあります)。

Beanが作成された後、それをトピックに接続します(DLMCを介して実用的に)。

トピックに送信される各メッセージには、特定のID(トピックのコンシューマーの1つ)が含まれます

レイテンシーとスループットは私にとって非常に重要です。

したがって、特定のBeanに大量のメッセージを送信している場合、そのBeanは非常にビジーであり、現在のジョブが完了するまで無料にならないため、各メッセージの間に途方もない遅延が発生します。

そのため、このような状況を回避するために、最初に作成するたびに同じBeanのプールを作成する必要があると思いました。

どうすればそれを達成できますか?多分それのための高レベルの解決策がありますか?

私はこれらの春のmdbを実用的に次のように作成しています:

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

1 に答える 1

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>

このコードはかなり賢いです。Beanを要求するたびに"uniqueConsumer"、Springは実際にすべての呼び出しをインターセプトする動的プロキシを返します。そのBeanでメソッドを実行しようとすると、Springはプールから1つのインスタンスを取得(または新しいインスタンスを作成)して転送します。

"maxSize"および"maxWait"パラメーターは自己記述的であり、プールを微調整するために使用されます。

于 2012-10-16T18:19:02.060 に答える