Spring 4 @Scheduled停止工作

时间:2015-08-30 13:28:30

标签: java spring scheduled-tasks spring-scheduled

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

这是调度程序:

//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:

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

春季版:

  

4.1.6.RELEASE

2 个答案:

答案 0 :(得分:9)

这种情况可能是由于调度方法体内的无限循环引起的,或者是否有对外部系统的调用,并且控件同步等待接收响应而没有任何超时。

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

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

答案 1 :(得分:3)

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