这两个注解是用在哪里的?
1,注解@DisallowConcurrentExecution和@PersistJobDataAfterExecution都是用在org.quartz.Job的实现类上的。
2,都是针对JobDetail实例的,而不是Job实现类的。
注解说明:
@PersistJobDataAfterExecution:告诉Quartz在成功执行了Job实现类的execute方法后(没有发生任何异常),更新JobDetail中JobDataMap的数据,使得该JobDetail实例在下一次执行的时候,JobDataMap中是更新后的数据,而不是更新前的旧数据。
@DisallowConcurrentExecution:告诉Quartz不要并发地执行同一个JobDetail实例。
举例说明:
同一个Job实现类DemoJob的两个JobDetail实例:A和B,设置A的定时执行频率为每1分钟执行一次,A的实际运行耗时为3分钟,B的定时执行频率也是每1分钟执行一次,B的实际运行耗时为30秒。假如在07:00分00秒时A和B同时第一次运行,则到07:00分30秒时B运行结束,此时A还在运行中,到07:01分00秒时A和B又该执行了,但是由于注解@DisallowConcurrentExecution的缘故,此时A不会再次运行,A只能在其上一次运行结束后才能再次被调用执行。但是B会正常运行(B不受A的影响,注解@DisallowConcurrentExecution是作用于JobDetail实例而不是Job实现类)
总结:
1,当某一个JobDetail实例到点运行之后,在其运行结束之前,不会再发起一次该JobDetail实例的调用,即使设置的该JobDetail实例的定时执行时间到了。
2,JobDetail实例之间互不影响
示例代码:
org.quartz.Job实现类:
@Slf4j
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class DemoJob implements Job {
@Override
public void execute(JobExecutionContext context) {
// do something
}
}
两个JobDetail实例:
// 定义触发器Trigger和调度器Scheduler省略
JobDetail A = JobBuilder.newJob(DemoJob.class)
.withDescription("jobDescription")
.withIdentity("name1", "group")
.build();
JobDetail B = JobBuilder.newJob(DemoJob.class)
.withDescription("jobDescription")
.withIdentity("name2", "group")
.build();
使用建议:
如果你使用了@PersistJobDataAfterExecution注解,则强烈建议你同时使用@DisallowConcurrentExecution注解,因为当同一个job(JobDetail)的两个实例被并发执行时,由于竞争,JobDataMap中存储的数据很可能是不确定的。