如何在 java 中使用 Quartz Cron 表达式从数据库中 运行 任务?
How to run tasks from db with Quartz Cron expression in java?
我正在尝试创建一个带有后台计划任务的文件备份应用程序。用户可以根据不同的时间表为备份文件创建很多计划。
当我开发一个样本时,我得到了一个有趣的结果。
每个任务都加载成功,但只有最后一个计划有效。这是我的结果:
plan_1 created...
plan_6 created...
plan_11 created...
plan_16 created...
plan_16 executed!
plan_16 executed!
plan_16 executed!
plan_16 executed!
plan_16 executed!
....
这 class 我的计划..
public class BasePlan {
private String name;
private String filePath;
private String schedule;
private boolean state;
public BasePlan() {
}
}
这是在数据库中创建的计划..
public class DummyData {
public static List<BasePlan> getWaitingPlans() {
List<BasePlan> planList = new ArrayList<BasePlan>();
for (int i = 1; i <= 20; i += 5) {
planList.add(new BasePlan("plan_" + i, "0/" + i + " * * * * ?", false, randomFilePath));
}
return planList;
}
}
这个class用来备份进度
public class BackupJobFactory implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
// this method will back up files in different time.
try {
SchedulerContext schedulerContext = context.getScheduler().getContext();
BasePlan plan = (BasePlan) schedulerContext.get("plan");
plan.setState(true);
System.out.println(plan.getName() + " executed!");
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
这是主要的class
public class MainApplication {
public static void main(String[] args) throws SchedulerException, ParseException {
for (BasePlan plan : DummyData.getWaitingPlans()) {
System.out.println(plan.getName() + " created...");
JobBuilder jobBuilder = JobBuilder.newJob(BackupJobFactory.class);
JobDetail job = jobBuilder.withIdentity(plan.getName(), plan.getName()).build();
Trigger trigger = TriggerBuilder
.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule(plan.getSchedule()))
.build();
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.getContext().put("plan", plan);
scheduler.start();
scheduler.scheduleJob(job, trigger);
}
}
}
我这样修改了我的代码,并且工作正常!
for (BasePlan plan : DummyData.getWaitingPlans()) {
System.out.println(plan.getName() + " created...");
JobBuilder jobBuilder = JobBuilder.newJob(BackupJobFactory.class);
JobDetail job = jobBuilder.withIdentity(plan.getName(), plan.getName()).build();
job.getJobDataMap().put("basePlan", plan);
Trigger trigger = TriggerBuilder
.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule(plan.getSchedule()))
.build();
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
}
}
我正在尝试创建一个带有后台计划任务的文件备份应用程序。用户可以根据不同的时间表为备份文件创建很多计划。
当我开发一个样本时,我得到了一个有趣的结果。
每个任务都加载成功,但只有最后一个计划有效。这是我的结果:
plan_1 created...
plan_6 created...
plan_11 created...
plan_16 created...
plan_16 executed!
plan_16 executed!
plan_16 executed!
plan_16 executed!
plan_16 executed!
....
这 class 我的计划..
public class BasePlan {
private String name;
private String filePath;
private String schedule;
private boolean state;
public BasePlan() {
}
}
这是在数据库中创建的计划..
public class DummyData {
public static List<BasePlan> getWaitingPlans() {
List<BasePlan> planList = new ArrayList<BasePlan>();
for (int i = 1; i <= 20; i += 5) {
planList.add(new BasePlan("plan_" + i, "0/" + i + " * * * * ?", false, randomFilePath));
}
return planList;
}
}
这个class用来备份进度
public class BackupJobFactory implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
// this method will back up files in different time.
try {
SchedulerContext schedulerContext = context.getScheduler().getContext();
BasePlan plan = (BasePlan) schedulerContext.get("plan");
plan.setState(true);
System.out.println(plan.getName() + " executed!");
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
这是主要的class
public class MainApplication {
public static void main(String[] args) throws SchedulerException, ParseException {
for (BasePlan plan : DummyData.getWaitingPlans()) {
System.out.println(plan.getName() + " created...");
JobBuilder jobBuilder = JobBuilder.newJob(BackupJobFactory.class);
JobDetail job = jobBuilder.withIdentity(plan.getName(), plan.getName()).build();
Trigger trigger = TriggerBuilder
.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule(plan.getSchedule()))
.build();
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.getContext().put("plan", plan);
scheduler.start();
scheduler.scheduleJob(job, trigger);
}
}
}
我这样修改了我的代码,并且工作正常!
for (BasePlan plan : DummyData.getWaitingPlans()) {
System.out.println(plan.getName() + " created...");
JobBuilder jobBuilder = JobBuilder.newJob(BackupJobFactory.class);
JobDetail job = jobBuilder.withIdentity(plan.getName(), plan.getName()).build();
job.getJobDataMap().put("basePlan", plan);
Trigger trigger = TriggerBuilder
.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule(plan.getSchedule()))
.build();
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
}
}