Quartz核心概念
1、核心概念
Job:要执行的业务逻辑,一般是一个实现了某个接口或者继承自某个类的类;
JobDetail:定义了一个任务的相关属性,包括要执行的业务逻辑(Job)、任务的标识(名称)、任务在没有Trigger关联的时候是否自动删除、任务在执行过程中会用到的一些属性等;
Trigger:触发器,定义了一个触发策略,如:多久执行一次、执行几次,什么时间点执行。用于关联到JobDetail,一个JobDetail可以关联多个Trigger;
Cron表达式:一种触发策略定义表达式;
Scheduler:调度器,是Quartz中的核心组件,它负责任务的调度、JobDetail、Trigger的管理,它包含了和定时调度相关的所有属性和操作。一般一个程序中就定义一个Scheduler组件。
SchedulerName:调度器的名称,每个调度器都有一个名称,用于区别其他调度器。
SchedulerInstanceId:调度器实例,Quartz支持多实例部署,每一个实例都有一个唯一的标识。
Misfire:一种状态,标识任务未按照既定的时间执行。
2、Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行,这样往往会导致我们执行的数据不正确。如果定时任执行太长,会长时间占用资源,导致其它任务堵塞。
解决办法:
①.在Spring中这时需要设置concurrent的值为false, 禁止并发执行。
<property name="concurrent" value="true" />
②.当不使用spring的时候就需要在Job的实现类上加@DisallowConcurrentExecution的注释。
@DisallowConcurrentExecution 禁止并发执行多个相同定义的JobDetail, 这个注解是加在Job类上的, 但意思并不是不能同时执行多个Job, 而是不能并发执行同一个Job Definition(由JobDetail定义), 但是可以同时执行多个不同的JobDetail, 举例说明,我们有一个Job类,叫做SayHelloJob, 并在这个Job上加了这个注解, 然后在这个Job上定义了很多个JobDetail, 如sayHelloToJoeJobDetail, sayHelloToMikeJobDetail, 那么当scheduler启动时, 不会并发执行多个sayHelloToJoeJobDetail或者sayHelloToMikeJobDetail, 但可以同时执行sayHelloToJoeJobDetail跟sayHelloToMikeJobDetail
@PersistJobDataAfterExecution 同样, 也是加在Job上,表示当正常执行完Job后, JobDataMap中的数据应该被改动, 以被下一次调用时用。当使用@PersistJobDataAfterExecution 注解时, 为了避免并发时, 存储数据造成混乱, 强烈建议把@DisallowConcurrentExecution注解也加上。