Quartz使用文档
前两天刚刚学习了一波Quartz怎么使用,单机实现quartz其实并不难,只需要任务实现类+调度器配置类+任务工厂类,调度器工厂配置的properties文件中中IsCluster的值设为false就行了。事实上,如果你只需要单机定时任务的话,在定时任务的方法前加一个spring自带的@Scheduled("cron表达式")注解就行了,轻量便捷可用性高,完全没有必要引入一个新包,不过记得在启动器前加一个@EnableScheduled注解使这个注解能被扫描到。现在开始讲的是集群环境下的Quartz的使用。
一、引用依赖
<!--quartz start-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<!--quartz end-->
第一个实现定时任务,第二个引入了集群化的相关包,第三个是为了实现job内自动注入
二、Quartz集群化的基本原理:
Quartz实现集群化的原理其实很简单,它其实是通过将任务、触发器等持久化到数据库中,通过对触发器上锁来实现多服务器下只触发一次的功能的,不过好的地方在于,当你建好了表配置好了DataSource,Quartz并不需要你给予数据库太多的关注,甚至可以假装它不存在。
当你进行schedule的时候,任务和触发器会一并存入数据库,而当你下一次从工厂类中取出schedule的时候,工厂类会自动扫描库中仍然活跃的任务和触发器,将它们置入schedule中再给你,所以如果你的业务很多,在我的结构的基础上另写一个QuartzJobManager接口+服务会更适合你。
三、基本结构——三类一配置一库
三类:调度器配置类、任务工厂类、任务实现类
一配置:储存调度器配置类中调度器工厂类配置的properties文件。
一库:持久化需要的数据库。

注:数据库不在java项目的体系内故为画在图上,数据库需要另建。
1.三类——调度器配置类、任务工厂类、任务实现类:
1.1任务实现类:
public class RepairRepairJob extends QuartzJobBean {
Logger logger = LoggerFactory.getLogger(RepairRepairJob.class);
@Autowired
LenkingService lenkingService;
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) {
lenkingService.createAndSendReport();
logger.info("Service has done.");
}
}
类如其名,在这里可以像服务实现类一样注入服务实现业务逻辑,但现在还只是个花瓶,因为它不在自动注入体系内,在有了任务工厂类之后就和Service实现类没什么区别了。
另,这里不一定要集成QuartzJobBean这个类,实现Quartz包中的Job也可以,业务都写在必须实现的形如executeXxx…的方法中。
1.2任务工厂类:
@Component
public class JobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object jobInstance = super.createJobInstance(bundle);
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
就是一个工具类,存在的意义是在这个类中将任务实现类放入springboot的自动注入体系中。job在quartz体系中是不会被springboot发现并注入的,只有通过工厂类配置手动连接才行。这个类基本只需要复制就行,就是一个工具类,基本不需要动。
1.3调度器配置类:
这个类中主要有两个方法,调度器工厂的配置方法和调度器的配置方法。
调度器工厂配置方法:
@Autowired
private JobFactory jobFactory;
@Bean