0

JMS リスナー プールがあります。

<jms:listener-container connection-factory="jmsConnectionFactory" 
 acknowledge="client" concurrency="10">
    <jms:listener destination="foo1" ref="ref1"/>
    <jms:listener destination="foo2" ref="ref2"/>
    <jms:listener destination="foo3" ref="ref3"/>
    <jms:listener destination="foo4" ref="ref4"/>  // etc...
</jms:listener-container>

一部のメッセージ タイプが他のすべてのメッセージ タイプを枯渇させたりブロックしたりしないようにする方法を探しています。例: foo1 メッセージの処理専用に、プールの少なくとも M パーセント、ただし N パーセントを超えないようにしたいと考えています。

現在、これをそのままにしておくと、プール内の 10 個のスレッドすべてが foo1 メッセージ専用になってしまいます。foo{2-4} メッセージは待機する必要があります。foo1 リスナーにタイムアウトを強制することで、このような飢餓を防ぐことができますが、スループットの目標を達成できません。

これを達成するための簡単な構成ベースの方法はありますか? 一度に 2 つの JMS リスナー プールを実行できますか?

それとも、1 つは foo1 メッセージ専用、もう 1 つは foo2-4 メッセージ専用の 2 つのまったく異なるサーバー フリートをセットアップするのが最も安全な方法ですか?

理想的には、次のようなことをしたいと思います。ただし、「同時実行」は jms:listener の属性ではなく、単なる jms:listener-container です。

<jms:listener-container connection-factory="jmsConnectionFactory" 
 acknowledge="client" concurrency="25">
    <jms:listener destination="foo1" ref="ref1" concurrency="10" /> // ensure higher throughput
    <jms:listener destination="foo2" ref="ref2" concurrency="5" />  // don't let foo1 starve me...
    <jms:listener destination="foo3" ref="ref3" concurrency="5" />  // don't let foo1 starve me...
    <jms:listener destination="foo4" ref="ref4" concurrency="5" />  // etc...
</jms:listener-container>

ありがとう。

4

1 に答える 1

2

名前空間の構成は、構成を簡素化するための便宜的なものであることを理解してください。各<listener/>要素は独自のリスナー コンテナを取得し、要素から属性を「継承」します<listener-container/>

したがって、最初の例では、 concurrency="10" はすべてのリスナーで共有されていません。それぞれ<listener/>の同時実行数は 10 です。

2 番目の例を実現するには<listener-container/>、同時実行数が 10 の要素と同時実行数が 5 の要素の 2 つの要素を宣言します。次に、適切なコンテナー要素で各リスナーを宣言します。

それが役立つことを願っています。

于 2012-12-14T02:16:10.490 に答える