怎么根据计划周期定时生成工单, 求解答?
怎么根据计划周期定时生成工单,当计划开始根据选择的周期,如立即执行一次,每天执行一次,每月执行一次。 最好可以指定每天几点,每月几号执行
回答:
import java.util.*;public class Main {
public static void main(String[] args) {
Timer timer = new Timer();
// 每天的特定时间(例如,每天的 14:30:00)执行任务
Calendar dailyTime = Calendar.getInstance();
dailyTime.set(Calendar.HOUR_OF_DAY, 14);
dailyTime.set(Calendar.MINUTE, 30);
dailyTime.set(Calendar.SECOND, 0);
if (dailyTime.before(Calendar.getInstance())) {
dailyTime.add(Calendar.DAY_OF_MONTH, 1);
}
timer.schedule(new MyTask(), dailyTime.getTime(), 24*60*60*1000);
// 每月的特定日期(例如,每月的第 10 天)执行任务
Calendar monthlyDate = Calendar.getInstance();
monthlyDate.set(Calendar.DAY_OF_MONTH, 10);
monthlyDate.set(Calendar.HOUR_OF_DAY, 14);
monthlyDate.set(Calendar.MINUTE, 30);
monthlyDate.set(Calendar.SECOND, 0);
if (monthlyDate.before(Calendar.getInstance())) {
monthlyDate.add(Calendar.MONTH, 1);
}
timer.schedule(new MyTask(), monthlyDate.getTime(), 30*24*60*60*1000);
}
static class MyTask extends TimerTask {
public void run() {
// 这里写你的任务
System.out.println("Task executed.");
}
}
}
回答:
直接上定时任务框架:Quartz、xxl-job、elastic-job
Quartz
优点:支持集群部署
缺点:没有自带的管理界面;调度逻辑和执行任务耦合在一起;维护需要重启服务
总结:针对目前项目情况,利弊相同
xxl-job
优点:支持集群部署;提供运维界面维护成本小;自带错误预警;相对elastic-job来说不需要额外的组件(zookeeper);支持调度策略;支持分片; 故障转移 ;更适合分布式
缺点:相对Quartz来说需要多部署调度中心
总结:针对目前项目情况,利大于弊
elastic-job
优点:支持集群部署;维护成本小
缺点:elastic-job需要zookeeper,zookeeper集群高可用至少需要三台服务器
总结:针对目前项目情况,弊大于利
回答:
xxl-job这个开源项目能满足你的需求https://www.xuxueli.com/xxl-job/#google_vignette
回答:
首先,需要创建一个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();
}
}
}
回答:
ruoyi 使用的是 quartz。
保存计划的时候,根据周期更新定时任务的Cron 表达式,参数为工单id,选择立即执行。
以上是 怎么根据计划周期定时生成工单, 求解答? 的全部内容, 来源链接: utcz.com/p/945261.html