怎么根据计划周期定时生成工单,当计划开始根据选择的周期,如立即执行一次,每天执行一次,每月执行一次。 最好可以指定每天几点,每月几号执行
怎么根据计划周期定时生成工单,当计划开始根据选择的周期,如立即执行一次,每天执行一次,每月执行一次。 最好可以指定每天几点,每月几号执行
直接上定时任务框架:Quartz、xxl-job、elastic-job
Quartz
优点:支持集群部署
缺点:没有自带的管理界面;调度逻辑和执行任务耦合在一起;维护需要重启服务
总结:针对目前项目情况,利弊相同
xxl-job
优点:支持集群部署;提供运维界面维护成本小;自带错误预警;相对elastic-job来说不需要额外的组件(zookeeper);支持调度策略;支持分片; 故障转移 ;更适合分布式
缺点:相对Quartz来说需要多部署调度中心
总结:针对目前项目情况,利大于弊
elastic-job
优点:支持集群部署;维护成本小
缺点:elastic-job需要zookeeper,zookeeper集群高可用至少需要三台服务器
总结:针对目前项目情况,弊大于利
首先,需要创建一个Job类,这个类定义了要执行的任务
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("执行任务!");
}
}
接下来,需要创建一个Scheduler来调度任务:
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.time.*;
public class MyScheduler {
public static void main(String[] args) {
try {
// 创建调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
// 定义任务
JobDetail job = JobBuilder.newJob(MyJob.class)
.withIdentity("myJob", "group1")
.build();
// 定义触发器
// 立即执行,并每24小时执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInHours(24)
.repeatForever())
.build();
// 定义特定时间触发器
LocalTime time = LocalTime.of(15, 0); // 每天15点执行
ZonedDateTime zonedDateTime = LocalDateTime.of(LocalDate.now(), time).atZone(ZoneId.systemDefault());
Date startAtDate = Date.from(zonedDateTime.toInstant());
Trigger triggerAtTime = TriggerBuilder.newTrigger()
.withIdentity("myTriggerAtTime", "group1")
.startAt(startAtDate)
.withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(time.getHour(), time.getMinute()))
.build();
// 将任务与触发器添加到调度器中
scheduler.scheduleJob(job, trigger);
scheduler.scheduleJob(job, triggerAtTime);
// scheduler 关闭时,jobs 将自动从数据库中删除
scheduler.shutdown(true);
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
15 回答8.4k 阅读
8 回答6.2k 阅读
4 回答4.4k 阅读✓ 已解决
4 回答4k 阅读
1 回答3k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决