coding++:@DisallowConcurrentExecution 注解的做用

Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 若是定时任执行太长,会长时间占用资源,致使其它任务堵塞。spring

在Spring中这时须要设置concurrent的值为false, 禁止并发执行。并发

 <property name="concurrent" value="true" />框架

当不使用spring的时候就须要在Job的实现类上加@DisallowConcurrentExecution的注释测试

@DisallowConcurrentExecution 禁止并发执行多个相同定义的JobDetail, 这个注解是加在Job类上的,线程

但意思并非不能同时执行多个Job, 而是不能并发执行同一个Job Definition(由JobDetail定义),资源

可是能够同时执行多个不一样的JobDetail, 举例说明,咱们有一个Job类,叫作SayHelloJob, 并在这个Job上加了这个注解, 而后在这个Job上定义了不少个JobDetail,it

如sayHelloToJoeJobDetail, sayHelloToMikeJobDetail, 那么当scheduler启动时, 不会并发执行多个sayHelloToJoeJobDetail或者sayHelloToMikeJobDetail,io

但能够同时执行sayHelloToJoeJobDetail跟sayHelloToMikeJobDetail定时任务

@PersistJobDataAfterExecution 一样, 也是加在Job上,表示当正常执行完Job后, JobDataMap中的数据应该被改动, 以被下一次调用时用。程序

当使用@PersistJobDataAfterExecution 注解时, 为了不并发时, 存储数据形成混乱, 强烈建议把 @DisallowConcurrentExecution注解也加上。

 

@DisallowConcurrentExecution

此标记用在实现Job的类上面,意思是不容许并发执行,按照我以前的理解是 不容许调度框架在同一时刻调用Job类,

后来通过测试发现并非这样,而是Job(任务)的执行时间[好比须要10秒]大于任务的时间间隔[Interval(5秒)],

那么默认状况下,调度框架为了能让 任务按照咱们预约的时间间隔执行,会立刻启用新的线程执行任务。

不然的话会等待任务执行完毕之后 再从新执行!(这样会致使任务的执行不是按照咱们预先定义的时间间隔执行)

测试代码,这是官方提供的例子。设定的时间间隔为3秒,但job执行时间是5秒,设置@DisallowConcurrentExecution之后程序会等任务执行完毕之后再去执行,不然会在3秒时再启用新的线程执行

相关文章
相关标签/搜索