Quartz 结构说明+定时任务配置+集群

本文详细介绍Quartz在集群环境下的使用方法,包括依赖引入、基本原理、结构配置及数据库表创建,适合企业级定时任务管理。

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文件。

一库:持久化需要的数据库。  

Quartz结构展示
Quartz结构展示

 

注:数据库不在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值