7

キューチャネルと、そのキューから読み取るポーラーを備えたサービスアクティベーターがあります。「50個のスレッドがそのキューをポーリングし、ポーリングしてメッセージが返されるたびに、このスレッドで、サービスアクティベーターが指すサービスを呼び出す」という構成が必要です。

このサービスには@Asyncアノテーションはありませんが、ステートレスであり、同時に実行しても安全です。

以下はそれをしますか?これを達成するための他の好ましい方法はありますか?

<int:channel id="titles">
    <int:queue/>
</int:channel>

<int:service-activator output-channel="resolvedIds" ref="searchService" method="searchOnTitle" input-channel="titles">
    <int:poller fixed-delay="100" time-unit="MILLISECONDS" task-executor="taskExecutor"></int:poller>
</int:service-activator>

<task:executor id="taskExecutor" pool-size="50" keep-alive="120" />
4

1 に答える 1

8

はい、私はそれがあなたが望むことをすると思います。QueueChannel を導入すると、対話は非同期になります。@Async は必要ありません。ポーラーを明示的に設定しない場合、デフォルトのポーラーが使用されます。

あなたが概説したことは、それを達成するための最良の方法です。また、キューのサイズに制限を設けることを検討することもできます。これにより、プロデューサーに追いつくのに遅れが生じた場合でも、メモリ不足の問題につながることはありません。サイズが指定されている場合、チャネルの送信呼び出しはブロックされ、スロットルとして機能します。

構成は期待どおりに機能します。唯一の問題は、エンドポイントごとにエグゼキューターとポーラーの作成を開始すると、アプリケーション全体の最適な構成を把握することが難しくなることです。いくつかの特定のステップに対してこの種の最適化を行うことは問題ありませんが、すべてのエンドポイントに対して行うわけではありません (あなたの質問には、あなたがそれを行っていることを示唆するものは何もありません。

于 2012-07-24T13:04:13.210 に答える