我正在使用Spring,我有一个计划任务,可以对数据库进行一些操作。 我发现这个任务是在每个池上执行的,而我只想执行一次。例如,在我的日志文件中,我读到了:
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 :(得分:0)
你的意思是:
您希望拥有多个线程,而某些任务仅在一个线程中执行,或者每个任务都在其自己的线程中运行。
如果是这样,最简单的方法是创建多个TaskScheduler,池大小为1.并且您可以使用TaskScheduler.schedule(...)
在java中触发计划作业。如果您有多个调度程序,则需要注入具有限定名称的不同调度程序。