Spring 4 @Scheduled 停止工作
Spring 4 @Scheduled stops working
我正在使用@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");
}
两者:"Starting agent" 和 "Ending agent" 被记录的次数相等。所以,每个调度都正常结束。
两者:"Starting task" 和 "Ending task" 被记录的次数相等。所以,"task" 绝对不会阻塞。
但它只是在一段时间后停止记录。可能是什么问题?
这里,TASK_EXECUTOR是下面的bean:
@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
这种情况可能是调度方法体中出现死循环,或者调用外部系统,控件同步等待接收响应,没有任何超时。
使用这个简单的代码片段自行尝试。该方法只会启动一次,在指定的 5 秒间隔后不会启动。
@Scheduled(fixedRate = 5000)
public void printPeriodically() {
System.out.println("This is my periodic method");
while(true) {};
}
查看作业是否被挂起。以防万一.. 任务不会在一段时间后执行,我的意思是在达到最大池大小之后。检查你的实现代码线程是否在成功执行后被释放。
我正在使用@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");
}
两者:"Starting agent" 和 "Ending agent" 被记录的次数相等。所以,每个调度都正常结束。
两者:"Starting task" 和 "Ending task" 被记录的次数相等。所以,"task" 绝对不会阻塞。
但它只是在一段时间后停止记录。可能是什么问题?
这里,TASK_EXECUTOR是下面的bean:
@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
这种情况可能是调度方法体中出现死循环,或者调用外部系统,控件同步等待接收响应,没有任何超时。
使用这个简单的代码片段自行尝试。该方法只会启动一次,在指定的 5 秒间隔后不会启动。
@Scheduled(fixedRate = 5000)
public void printPeriodically() {
System.out.println("This is my periodic method");
while(true) {};
}
查看作业是否被挂起。以防万一.. 任务不会在一段时间后执行,我的意思是在达到最大池大小之后。检查你的实现代码线程是否在成功执行后被释放。