java - 长时间运行的春季计划任务
问题描述
我在 context.xml 文件中定义了一个 Spring 计划任务,它每分钟运行一次。该任务调用一个 postgres 存储过程。存储过程运行时间可以持续一分钟以上。如果当前运行未完成,spring 框架会调用相同的调度程序吗?谢谢,
解决方案
在spring框架中,一个定时任务只能由一个线程执行,如果执行时间长于间隔时间,任务就会被延迟。下面是一个简单的例子:
@Scheduled(cron = "0/3 * * * * *")
public void work() {
log.info("begin to do some work,current thread is {}", Thread.currentThread().getName());
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
log.error(e.toString());
}
}
我创建了一个计划任务,预期执行顺序:0 3 6 9 ...,但任务需要更多时间,所以执行顺序:0 6 12 18 ...
在spring中,所有任务都将由线程执行(默认),为了减少任务之间的干扰,我们可以支持一个线程池来执行这样的调度任务:
@Bean
public ThreadPoolTaskScheduler taskExecutor() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(20);
return scheduler;
}
关于春季计划任务的其他问题:spring @Scheduled 注解的方法是否在不同的线程上运行?
推荐阅读
- javascript - JavaScript - 改变对象字面量的值
- sharepoint - 使用 Power 自动将 PDF 文件从 Sharepoint 文件夹复制到 FTP
- javascript - 如何在反应中从地图中获取第一个值
- javascript - React 光滑的轮播项目变得模糊
- azure - Azure B2C:使用自定义声明查询 AAD?
- security - 金融科技公司所需的认证
- swift - 如何使用 IPad 从 IPad 上的 View Image 获取点云(RGB,设备上的 2D 坐标,3D 点的坐标)?
- python - 防止exec内部python中的无限循环
- angular11 - 无法在 HTML (Angular) 上使用
- c# - Webservice XML 解析错误:找不到根元素位置:http://localhost/Service1.svc 第 1 行,第 1 列:^