2015-08-30 120 views
0

我使用@Scheduled注释来运行cron作业。调度工作一段时间,然后停止工作。 我会给我的代码简化的片段:Spring 4 @Scheduled停止工作

这是调度:

//org.springframework.scheduling.annotation.Scheduled 
@Scheduled("*/30 * * * * *")  
public void performTask() { 
    logger.info("Starting agent"); 
    getAgentAsyncTask().execute(); 
    logger.info("Ending agent"); 
} 

这是由调度

//org.springframework.scheduling.annotation.Async 
@Async(TASK_EXECUTOR) 
@Override 
public void execute() { 
    logger.info("Starting task"); 
    //send some rest requests 
    logger.info("Ending task"); 
} 

两个执行任务:“启动剂”和“结束代理“记录的次数相等。所以,每个计划都会正常结束。

两者:“开始任务”和“结束任务”被记录相同的次数。所以,“任务”绝对不是阻碍事物。

但它只是在一段时间后停止记录。什么可能是这个问题?

这里,TASK_EXECUTOR如下豆:

@Bean(TASK_EXECUTOR) 
public ThreadPoolTaskExecutor createDefaultTaskExecutor() { 
      ThreadPoolTaskExecutor te = new ThreadPoolTaskExecutor(); 
      te.setMaxPoolSize(15); 
      te.setCorePoolSize(15); 
      te.initialize(); 
      return te; 
    } 

Spring版本:

4.1.6.RELEASE

+0

你在容器内部还是外部运行?另外,什么版本的Java? – Brad

+0

容器内部(基于Annotation的配置,我有@EnableScheduling @EnableAsync)。 Java版本8 – coolscitist

+4

你读过吗? http://stackoverflow.com/q/17909404/206466 – xenoterracide

回答

7

这种情况可能会在一个无限循环引起的预定方法的主体,或者是否存在对外部系统的调用,并且控件同步等待以在没有任何超时的情况下接收响应。

用这个简单的代码片段自己试一试。该方法将仅启动一次,并且在指定的5秒间隔后不会启动。

@Scheduled(fixedRate = 5000) 
public void printPeriodically() { 
    System.out.println("This is my periodic method"); 
    while(true) {}; 
} 
0

看看工作是否被吊死。如果它确实如此,那么任务在一段时间后不会执行,我的意思是在达到最大池大小之后。检查执行代码是否在成功执行后释放线程。