2016-08-04 6 views
2

私はSpringを使用しており、データベースに対していくつかの操作を行うスケジュールされたタスクがあります。 私はこのタスクが各プールで実行されているのではなく、1回だけ実行したいと思います。たとえば、私が読ん私のログファイルに:スケジュールされたタスクは一度だけ実行でき、すべてのスレッドプールで実行することはできませんか?

2016-08-04 01:01:01 [pool-2-thread-1] INFO c.w.c.FleetAndCarControllerImpl - SCHEDULED ACTIVITY TO DELETE OLD NOTIFICATIONS 
2016-08-04 01:01:01 [pool-3-thread-1] INFO c.w.c.FleetAndCarControllerImpl - SCHEDULED ACTIVITY TO DELETE OLD NOTIFICATIONS 

私は、この設定があります。

@Override 
    public Executor getAsyncExecutor() { 
     ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
     executor.setCorePoolSize(10); 
     executor.setMaxPoolSize(100); 
     executor.setQueueCapacity(100); 
     executor.initialize(); 
     return executor; 
    } 

を、これはタスクです:

//This task is executed every day at 01:01 a.m. 
    @Scheduled(cron = "0 1 1 * * ?") 
    public void smartQuery(){ 
     try { 
      LOG.info("SCHEDULED ACTIVITY TO DELETE OLD NOTIFICATIONS"); 
      notificationManagementServices.deleteOldNotifications(); 
     } catch (QueryException e) { 
      ErrorResponse errorResponse= ErrorResponseBuilder.buildErrorResponse(e); 
      LOG.error("Threw exception in WakeUpDatabase::smartQuery :" + errorResponse.getStacktrace()); 
     } 
    } 

は、それは可能です感謝

+0

コアプールサイズを「1」に設定します。 –

+2

"このタスクは各スレッドで実行されているとわかりました"どのように正確に把握できましたか? – Kayaman

+0

私のログファイルには、ログメッセージが複数回印刷されています。私はいくつかの行のメインポストを更新しました – luca

答えて

0

?あなたはこれを意味しますか:
あなたは複数のスレッドを持ちたいと思います。 1つのスレッドで実行されるか、各タスクは独自のスレッドで実行されます。

もしそうなら、最も簡単な方法は、プールサイズが1の複数のTaskSchedulerを作成することです。そして、javaでスケジュールされたジョブをTaskScheduler.schedule(...)でトリガーすることができます。複数のスケジューラーがある場合は、異なるスケジューラーに修飾名を注入する必要があります。

+0

はい、私は複数のスレッドを持っていますが、スケジュールされたタスクのようなタスクは、一度に実行され、すべてのスレッドで実行されるべきではありません(それぞれのスレッドに対して同じクエリを作成するのは無駄です) – luca

+0

私はあなたができるとは思わないプール内の1つのスレッドでのみ実行される1つのタスクを割り当てます。だから私のソリューションはいくつかのタスクスケジューラを作成し、あなたはJavaコードでタスクを割り当ててトリガし、修飾された名前を持つ指定されたタスクスケジューラを取得し、必要に応じてジョブをスケジュールすることができます。 – Mavlarn

+0

サンプルコードがありますか? 1つのスケジュールされたタスクしか作成できないことは間違いです – luca

関連する問題