Quartz
spring boot中使用
<!--SpringBoot集成QuartZ-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
==注意:==如果要重写quartz的配置文件,只需要在类路径下写quartz.properties文件
-
执行任务的类需要实现``Job
或者Job的子类
QuartzJobBean`进行业务操作- 如果在该方法中实现调用其它service中的方法,需要通过applicationContext上下文注入该bean
-
使用调度器调度任务
-
JobBuilder.newJob ->
JobDetail
-
TriggerBuilder.newTrigger ->
CronTrigger
-
scheduler.scheduleJob(jobDetail, cronTrigger);
-
//其它方法:
//暂停触发器
scheduler.pauseTrigger(new TriggerKey(jobName, defaultGroup));
// 移除触发器中的任务
scheduler.unscheduleJob(new TriggerKey(jobName, defaultGroup));
// 删除任务
scheduler.deleteJob(new JobKey(jobName, defaultGroup));
多线程下保证schedule是同一个
@Component
public class TaskSchedulerFactory {
protected final Logger log = LoggerFactory.getLogger(TaskSchedulerFactory.class);
private volatile Scheduler scheduler;
/**
* 获得scheduler实例
*/
public Scheduler getScheduler() {
Scheduler s = scheduler;
if (s == null) {
synchronized (this) {
s = scheduler;
if (s == null) {
// 双重检查
try {
SchedulerFactory sf = new StdSchedulerFactory();
s = scheduler = sf.getScheduler();
} catch (Exception e) {
log.error("Get scheduler error :" + e.getMessage(), e);
}
}
}
}
return s;
}
}
quartz.properties
org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 20
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true
org.quartz.jobStore.misfireThreshold: 60000
org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
org.quartz.scheduler.skipUpdateCheck: true
##===============================================================
##配置文件不是必须的,Quartz对配置项都是有默认值的,当需要自定义的时候,
##可以在classpath路径下放一个quartz.properties文件,Quartz的StdSchedulerFactory
##在启动时会自动加载该配置文件。
##===============================================================
#
#
##===============================================================
##配置主调度程序的属性
##===============================================================
#org.quartz.scheduler.instanceName = DefaultQuartzScheduler
#org.quartz.scheduler.rmi.export = false
#org.quartz.scheduler.rmi.proxy = false
#org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
##当检查某个Trigger应该触发时,默认每次只Acquire一个Trigger,(为什么要有Acquire的过程呢?是为了防止多线程访问的情况下,
##同一个Trigger被不同的线程多次触发)。尤其是使用JDBC JobStore时,一次Acquire就是一个update语句,尽可能一次性的多获取
##几个Trigger,一起触发,当定时器数量非常大的时候,这是个非常有效的优化。当定时器数量比较少时,触发不是极为频繁时,
##这个优化的意义就不大了。
#org.quartz.scheduler.batchTriggerAcquisitionMaxCount=50
#
##===============================================================
##配置线程池的属性
##===============================================================
#org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
##线程池里的线程数,默认值是10,当执行任务会并发执行多个耗时任务时,要根据业务特点选择线程池的大小。
#org.quartz.threadPool.threadCount = 4
#org.quartz.threadPool.threadPriority = 5
#org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
#
##===============================================================
##配置JobStore的属性
##===============================================================
#org.quartz.jobStore.misfireThreshold = 60000
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore