0
嗨我有一個工作1觸發非常分鐘的火和一個工作2觸發每5分鐘觸發一次。因此,每五分鐘就會有一份工作同時運行,我想避免這種情況,並強制第二份工作開始等待另一份工作完成。我已經看到了@DisallowConcurrentExecution,但是這隻會避免並行運行相同作業的兩個實例,而不會在不同作業之間運行。你可以順序運行兩個不同的Quartz作業實例嗎?
嗨我有一個工作1觸發非常分鐘的火和一個工作2觸發每5分鐘觸發一次。因此,每五分鐘就會有一份工作同時運行,我想避免這種情況,並強制第二份工作開始等待另一份工作完成。我已經看到了@DisallowConcurrentExecution,但是這隻會避免並行運行相同作業的兩個實例,而不會在不同作業之間運行。你可以順序運行兩個不同的Quartz作業實例嗎?
對於那些感興趣的人,我設法做的是融合兩個工作在一個單一的但有兩個不同的觸發器指向同一個工作。每個觸發器都有自己的觸發時間,並且參數器現在被保存在每個觸發器的數據映射中,而不是作業數據映射。另外,啞火政策已更改爲MisfireHandlingInstructionFireAndProceed
這是代碼:
public class QuartzTest {
public static final String PROCESS_TRIGGER_MAP_KEY = "process";
public static void main(String[] args) throws SchedulerException, InterruptedException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
JobDetail job1 = newJob(TestJob.class).withIdentity("job1", "group1").build();
CronTrigger trigger1 = newTrigger().withIdentity("trigger1", "group1").startAt(new Date()).withSchedule(cronSchedule(getCronExpression(1)).withMisfireHandlingInstructionFireAndProceed()).build();
trigger1.getJobDataMap().put(PROCESS_TRIGGER_MAP_KEY, new MessagePrinter() {
@Override
public void print() {
System.out.println(new Timestamp(System.currentTimeMillis()) + " This is process 1");
}
});
scheduler.scheduleJob(job1, trigger1);
CronTrigger trigger2 = newTrigger().withIdentity("trigger2", "group1").forJob(job1).startAt(new Date()).withSchedule(cronSchedule(getCronExpression(2)).withMisfireHandlingInstructionFireAndProceed()).build();
trigger2.getJobDataMap().put(PROCESS_TRIGGER_MAP_KEY, new MessagePrinter() {
@Override
public void print() {
System.out.println(new Timestamp(System.currentTimeMillis()) + " This is process 2");
}
});
scheduler.scheduleJob(trigger2);
Thread.sleep(5 * 60 * 1000);
}
private static String getCronExpression(int interval) {
return "0 */" + interval + " * * * ?";
}
}
這裏是作業類
@DisallowConcurrentExecution
public class TestJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
MessagePrinter mp = (MessagePrinter) context.getTrigger().getJobDataMap().get(QuartzTest.PROCESS_TRIGGER_MAP_KEY);
if (mp != null) {
mp.print();
} else {
System.out.println(new Timestamp(System.currentTimeMillis()) + " Job started");
}
System.out.println(new Timestamp(System.currentTimeMillis()) + " Job sleeping 10s...");
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(new Timestamp(System.currentTimeMillis()) + " Job finished.");
}
}
和處理器類:
public abstract class MessagePrinter {
public MessagePrinter() {
}
public abstract void print();
}