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>
ありがとう。