2017-07-14 7 views
0

私はSpringスケジューラで定期的に実行する2つの方法を持っていますが、@ Scheduled(fixedRate = 300000) - 5分ごとと 他は@Scheduledです(cron = "0 0 0 2 * *? ) - 毎日午前2時。スレッドプールでtaskSchedulerを使用していないので、スレッドが1つしかないので、重複はありませんSpring @Scheduler Overlap

私が観察したことは、他の@スケジューリングされたジョブを実行できないとします。私の5分のジョブが午前1時45分に開始し、処理に45分かかったとしましょう。スレッドが5分ジョブで忙しいため、午前2時に開始すると思われるその他のcronは開始できません。スレッドが解放されると、他の2時のジョブが開始される設定があります。スレッドの動作を理解するのに役立ちますそのような場合。

答えて

2

デフォルトでは、Springスケジューラはジョブの実行に単一のスレッドを提供します。 1つ以上のスレッドとキューを持つタスクエグゼキュータを設定すると、すべてのスレッドがビジー状態のジョブがキューに追加され、スレッドが解放されるとすぐに取得できるようになります。

次の例では、単純なScheduledThreadPoolを作成します。

@EnableScheduling 
@Configuration 
public class Configuration implements SchedulingConfigurer { 

    @Override 
    public void configureTasks(ScheduledTaskRegistrar 
    scheduledTaskRegistrar) { 
     scheduledTaskRegistrar.setScheduler(taskExecutor()); 
    } 

    @Bean(destroyMethod="shutdown") 
    public Executor taskExecutor() { 
     return Executors.newScheduledThreadPool(5); 
    } 
}