2012-01-15 21 views
2

私はSpring ThreadPoolTask​​Schedulerを使用して、5分ごとに非同期メソッドを実行しています。場合によってはメソッドの実行に5分以上かかります。このようなシナリオで動作を観察しようとしましたが、現在の実行が完了するまで(たとえ5分間隔が終了しても)メソッドが再度実行されないようです。ThreadPoolSchedulerの間隔がタスクの実行時間より短い

これは私が達成したいものをスーツが、2番目のスレッドが5分以上を取っているものと並行してメソッドを実行するために、5分後に生み出されていない理由を私は疑問に思ってますが。最初は、デフォルトでプールサイズが1であると考えました。しかし、プールのサイズを大きくしても、動作は変わりません。

私は、ThreadPoolSchedulerコードを詳しく調べようとしましたが、内部的にはThreadPoolExecutor経由でタスクを実行しているようです。インターバルが経過しても、実行を完了するのを待つスレッドが1つだけ実行されるように設計されていますか?

<task:scheduler id="scheduler" pool-size="1" /> 


scheduler.scheduleAtFixedRate(new Runnable() { 
    public void run() { 
    executeThis(); // this takes more than 5 minutes sometime 
    } 
}, 5*60*1000); 

よろしく、

Tushar

答えて

4

第二のスレッドが、それは方法の契約を壊すので、生成されたits javadocで指定されていません。

このタスクのいずれかの実行はもはやその期間以上かかる場合は、 その後の実行が遅れて開始することができ、同時に実行されません 実行します。

この動作は、文書化された動作です。私が先に言ったように

3

あなたのプールサイズが1である - - それは、A提出するため、5分、中に限り、コードがこの私は何をすべきか、私懸念している

新しいタスク - ただし、それを実行するためのスレッドはありません。そのため、タスクは元のスレッドが完了するまで待機してから、新しいタスクをスケジュールします。タスクが一定の間隔で実際に開始する必要のあるものであれば、プールサイズを増やしてください。

+0

、私は試してみて、プールのサイズを増やすが、それは動作に影響を与えるようには見えませんでした。 – Tushar

関連する問題