java - 如何在 Spring Boot 中实现单线程调度程序?
问题描述
我想每 00 秒执行一次进程。(服务器时间)
但是,这些进程可能需要一分钟或更长时间。
当进程仍在运行时,
是否有优雅的方法来阻止相同的进程(方法)运行?(我不想运行该过程)
(如果进程#2 结束,
即使进程#1 正在运行,进程#2 也必须独立运行。)
@Scheduled(cron = "0 * * * * ?")
public void process1() {
//doing something during
//It may take a minute or more
}
@Scheduled(cron = "0 * * * * ?")
public void process2() {
//doing something during
//It may take a minute or more
}
解决方案
我用下面的源代码自己解决了这个问题。
@Service
public class Scheduler {
@Autowired
private Job1Service job1;
@Autowired
private Job2Service job2;
@Scheduled(cron = "0 * * * * ?")
private void job1() {
new Thread(job1).start();
}
@Scheduled(cron = "0 * * * * ?")
private void job2() {
new Thread(job2).start();
}}
}
public class Job1ServiceImpl implements Job1Service, Runnable{
private final ReentrantLock lock = new ReentrantLock(true);
public void run() {
try {
if(lock.tryLock(1, TimeUnit.MILLISECONDS)) {
try {
logger.info("job1 start");
/* do heavy job
for(int i = 0 ; i < 100 ; i++) {
logger.info("test#1 : " + i);
for(int j = 0 ; j < 999999999 ; j++) {
int k = 1;
k++;
k++;
}
}
*/
}catch(Exception e) {
logger.error("job#1 error", e);
}finally {
logger.info("job #1 end");
lock.unlock();
}
}else {
logger.info("skip job#1. job #1 is running still");
}
}catch(InterruptedException e) {
logger.info("Job #1 Aborted", e);
}
}
}
public class Job2ServiceImpl implements Job2Service, Runnable{
private final ReentrantLock lock = new ReentrantLock(true);
public void run() {
try {
if(lock.tryLock(1, TimeUnit.MILLISECONDS)) {
try {
logger.info("job2 start");
/* do heavy job
for(int i = 0 ; i < 100 ; i++) {
logger.info("test#2 : " + i);
for(int j = 0 ; j < 999999999 ; j++) {
int k = 1;
k++;
k++;
}
}
*/
}catch(Exception e) {
logger.error("job#2 error", e);
}finally {
logger.info("job #2 end");
lock.unlock();
}
}else {
logger.info("skip job#2. job #2 is running still");
}
}catch(InterruptedException e) {
logger.info("Job #2 Aborted", e);
}
}
}
推荐阅读
- java - 在导航抽屉中实现退出项
- javascript - 如何找出我的 WebSocket 连接失败的原因?
- vue.js - Nuxt.js 静态站点相对 url
- c# - 如何使用自定义类型重载 System.Math 方法
- c# - Azure 服务总线触发器未同时处理基于会话的队列
- coldfusion - Coldfusion StructSetMetaData 不更新结构内数组中的项目
- flutter - 限制 showDialog 屏障和内容的大小
- templates - Wagtail CMS 样式覆盖
- azure - 具有 Vnet 集成和专用端点的函数应用程序 -> 服务器响应:服务不可用
- r - 如何在 R 中合并同一数据框中的行