9

次のようにスケジュールされたタスクがあります。

<task:scheduler id="notification.scheduler" pool-size="15" />

<task:scheduled-tasks scheduler="notification.scheduler">
    <task:scheduled ref="notificationProcessor" method="sendNextQueueEvent" fixed-rate="500" />
    <task:scheduled ref="notificationProcessor" method="deleteNextCompletedEvent" fixed-rate="60000" />
</task:scheduled-tasks>

スケジュールされたタスクがプール サイズでどのように機能するかを誤解していると思います。プールサイズは 15 ですが、使用されているスレッドは 1 つだけのようです。たとえば、キュ​​ーに 15 個のイベントがある場合、キューからイベントを削除するために毎分チェックする 15 個のスレッドがあると思います。明らかに、これは間違っています。

Spring のスケジューラの抽象化を使用して、時間間隔でこのメソッドを呼び出す 15 のスレッドがあるようにするにはどうすればよいですか?

編集:私が達成したいのはこれです:0.5秒ごとに、送信するキューイベントがあるかどうかを確認したいと思います。これが完了したら、最大 15 個 (15 個存在する場合) を送信したいと考えています。Java スレッド用のスプリング抽象化を使用してこれを達成するにはどうすればよいですか?

4

2 に答える 2

6

まず、 extending<task:scheduler/>のラッパーです。後者の JavaDoc は次のように述べています。ScheduledThreadPoolExecutorThreadPoolExecutor

コアスレッドでさえ、最初に作成され、新しいタスクが到着したときにのみ開始されます

次に、スケジュールされたタスク (これは Java の機能であり、Spring の機能ではありません) は、繰り返し間隔よりも長い時間がかかる場合でも、同時に実行されないことを理解する必要があります。彼らはただ待つだけです。したがって、キューで待機している 15 のイベントはありません。遅延してその単一のスレッドを待機している 15 の実行があります。次の実行は前の実行が完了するまで待機する必要があるため、別の実行を作成する必要はありません。繰り返しますが、これが Java スケジューリング フレームワークのしくみです。

もちろん、複数の異なるタスクがスケジュールされている場合は、より多くのスレッドが作成されます。

于 2012-04-20T19:14:08.337 に答える
4

Spring のtask:schedulerデフォルトは、次の Bean プロパティ ラッパーですjava.util.concurrent.ThreadPoolExecutor

corePoolSize - アイドル状態であっても、プールに保持するスレッドの数。

これは、プロパティがその数のアクティブなスレッドpools-sizeを持つことと同等であることを保証するものではありません。一方、任意の時点で、使用しているマシンの処理コアに等しい最大数のスレッドしか存在できないことに注意してください。つまり、他のすべてのスレッドは、モードに切り替えて実行を継続するのを待機します。RUNNING

また、Spring のドキュメントでは、これが必要でない場合は、ConcurrentTaskExecutor.

于 2012-04-20T18:23:40.257 に答える