当分别设置两个trigger的startTime为同一时间点,首次执行时优先级低的可能会先被触发
来源:10-9 Trigger的优先级
msidolphin
2019-09-15
首次执行时优先级低的可能会先被触发,之后会按照优先级的从高到低执行
是否是因为虽然设置了相同的触发时间点,但是两个trigger并没有同时触发?那么如何避免这种问题呢?
import com.msidolphin.job.MyJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
public class QuartzApp {
public static void main( String[] args ) throws SchedulerException, InterruptedException {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
Date startTime = DateBuilder.futureDate(5, DateBuilder.IntervalUnit.SECOND);
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
.withIdentity("jobDetail", "group1")
.build();
JobDetail jobDetail2 = JobBuilder.newJob(MyJob.class)
.withIdentity("jobDetail2", "group2")
.build();
Trigger trigger1 = TriggerBuilder.newTrigger()
.startAt(startTime)
.withPriority(1)
.usingJobData("msg", "我是trigger1触发的")
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever())
.build();
Trigger trigger2 = TriggerBuilder.newTrigger()
.startAt(startTime)
.withPriority(9)
.usingJobData("msg", "我是trigger2触发的")
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever())
.build();
scheduler.scheduleJob(jobDetail, trigger1);
scheduler.scheduleJob(jobDetail2, trigger2);
Thread.sleep(60 * 1000);
scheduler.shutdown();
}
}
写回答
1回答
-
凌波微步
2019-09-18
可能是由于scheduleJob方法 分开执行的原因,可以考虑一次性注册两个任务。
Map<JobDetail, Set<? extends Trigger>> map = new HashMap<>();
Set<Trigger> set1 = new HashSet<>();
set1.add(trigger1);
Set<Trigger> set2 = new HashSet<>();
set1.add(trigger2);
map.put(jobDetail,set1);
map.put(jobDetail2,set2);
scheduler.scheduleJobs(map, true);00
相似问题