是否可以只执行一次计划任务而不是所有线程池?

时间:2016-08-04 06:35:00

标签: java spring scheduled-tasks threadpool

我正在使用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());
        }
    }   

有可能吗?谢谢

1 个答案:

答案 0 :(得分:0)

你的意思是:
您希望拥有多个线程,而某些任务仅在一个线程中执行,或者每个任务都在其自己的线程中运行。

如果是这样,最简单的方法是创建多个TaskScheduler,池大小为1.并且您可以使用TaskScheduler.schedule(...)在java中触发计划作业。如果您有多个调度程序,则需要注入具有限定名称的不同调度程序。