程序员Java 杂谈

Quartz设计原理详解(多图)

2018-12-21  本文已影响12人  黄大海

定时任务是日常开发中非常常见的功能。

对于简单的任务处理Spring的@Scheduled非常好用。
如果处理更复杂的情况,比如需要宕机恢复或者集群调度,那么Quartz是个不错的轻量级方案。
一些重量级的第三方任务调度系统也是基于Quartz扩展的,比如XXL-JOB

Quartz的模块

Quartz模块.png
public interface Job {
    void execute(JobExecutionContext context) throws JobExecutionException;
}
public class JobExecutionException extends SchedulerException {
    private boolean refire = false;//true: 重新执行任务(不会触发下一次)
    private boolean unscheduleTrigg = false;//true: 直接标记Trigger完成
    private boolean unscheduleAllTriggs = false;//true: 直接标记所有和Job相关的Trigger都已经完成
}
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public interface StatefulJob extends Job {
}
  1. MisfireHandler 错失触发的任务恢复线程,。更新Trigger的触发时间。
  2. ClusterManager 集群协调线程。定期心跳,自动recover。同主程序中的recover。

SpringBoot2.0集成Quartz

从boot2.0开始,增加了对Quartz的自动装配,以前需要自己处理。
以集群配置为例,最基本的操作是这样的:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
    public class TestJob extends QuartzJobBean {
        @Override
        protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
            System.out.println("Test job executed.");
        }
    }
    @Bean
    public JobDetail testJob(){
        return JobBuilder
                .newJob(TestJob.class)
                .withIdentity("TestJob")
                .storeDurably()
                .requestRecovery()
                .build();
    }
    @Bean
    public Trigger testTrigger(){
        return TriggerBuilder.newTrigger()
            .withIdentity("TestTrigger")
            .forJob("TestJob")
            .withSchedule(CronScheduleBuilder
                    .cronSchedule("0/6 * * * * ? ")
                    .withMisfireHandlingInstructionDoNothing())
            .build();
    }
    @Bean
    @Primary
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean
    @QuartzDataSource
    @ConfigurationProperties(prefix="spring.datasource.quartz")
    public DataSource quartzDataSource() {
        return DataSourceBuilder.create().build();
    }
spring.quartz.job-store-type=jdbc
spring.quartz.org.quartz.scheduler.instanceId = AUTO
spring.quartz.org.quartz.jobStore.isClustered = true
spring.quartz.jdbc.initializeSchema=ALWAYS
#spring.quartz.jdbc.initializeSchema=NEVER
上一篇下一篇

猜你喜欢

热点阅读