详解Quartz中的注解:@DisallowConcurrentExecution和@PersistJobDataAfterExecution

这两个注解是用在哪里的?

1,注解@DisallowConcurrentExecution和@PersistJobDataAfterExecution都是用在org.quartz.Job的实现类上的。
2,都是针对JobDetail实例的,而不是Job实现类的。

注解说明:

@PersistJobDataAfterExecution:告诉Quartz在成功执行了Job实现类的execute方法后(没有发生任何异常),更新JobDetail中JobDataMap的数据,使得该JobDetail实例在下一次执行的时候,JobDataMap中是更新后的数据,而不是更新前的旧数据。

@DisallowConcurrentExecution:告诉Quartz不要并发地执行同一个JobDetail实例。

举例说明

同一个Job实现类DemoJob的两个JobDetail实例:AB,设置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中存储的数据很可能是不确定的。

  • 17
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值