2016-08-04 69 views
2

我正在使用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

将核心池大小设置为'1'。 –

+2

“我想出了这个任务是在每个线程上执行的”你究竟是怎么弄出来的? – Kayaman

+0

在我的日志文件中,我读了多次打印的日志消息。我已经更新了一些行的主帖 – luca

回答

0

?你的意思是这样的:
你想拥有多个线程和一些任务在一个线程中执行,或者每个任务都在它自己的线程中运行。

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

+0

是的,我想有多个线程,但一些任务,如计划任务,应该执行一次,而不是所有的线程(这是没用的,使每个线程相同的查询) – luca

+0

我不认为你可以分配一个只在池中的一个线程中执行的任务。所以我的解决方案是创建几个任务调度程序,并且您可以在java代码中分配和触发任务,您可以获得具有限定名称的一个指定任务调度程序,并按需要安排任务。 – Mavlarn

+0

你有一个示例代码?奇怪的是,不可能只创建一个计划任务 – luca

相关问题