具体表描述如下:
表名 | 描述 |
QRTZ_BLOG_TRIGGERS | Trigger作为Blob类型存储 |
QRTZ_CALENDARS | 存储Quartz的Calendar信息 |
QRTZ_CRON_TRIGGERS | 存储CronTrigger,包括Cron表达式和时区信息 |
QRTZ_FIRED_TRIGGERS | 存储与已触发的Trigger相关的状态信息,以及相联Job的执行信息 |
QRTZ_JOB_DETAILS | 存储每一个已配置的Job的详细信息 |
QRTZ_LOCKS | 存储程序的悲观锁的信息 |
QRTZ_PAUSED_TRIGGER_GRPS | 存储已暂停的Trigger组的信息 |
QRTZ_SCHEDULER_STATE | 存储少量的有关Scheduler的状态信息,和别的Scheduler实例 |
QRTZ_SIMPLE_TRIGGERS | 存储简单的Trigger,包括重复次数、间隔、以及已触的次数 |
QRTZ_SIMPROP_TRIGGERS | 存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器 |
QRTZ_TRIGGERS | 存储已配置的Trigger的信息 |
其中,QRTZ_LOCKS 就是 Quartz 集群实现同步机制的行锁表!
四、Quartz 集群实践
4.1、创建springboot项目,导入maven依赖包
<!--引入boot父类--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.0.RELEASE</version> </parent> <!--引入相关包--> <dependencies> <!--spring boot核心--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!--spring boot 测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--springmvc web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--开发环境调试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <!--jpa 支持--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!--mysql 数据源--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--druid 数据连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.17</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <!--Alibaba Json处理包 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.46</version> </dependency> </dependencies>
4.2、创建 application.properties 配置文件
spring.application.name=springboot-quartz-001 server.port=8080 #引入数据源 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
4.3、创建 quartz.properties 配置文件
#调度配置 #调度器实例名称 org.quartz.scheduler.instanceName=SsmScheduler #调度器实例编号自动生成 org.quartz.scheduler.instanceId=AUTO #是否在Quartz执行一个job前使用UserTransaction org.quartz.scheduler.wrapJobExecutionInUserTransaction=false #线程池配置 #线程池的实现类 org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool #线程池中的线程数量 org.quartz.threadPool.threadCount=10 #线程优先级 org.quartz.threadPool.threadPriority=5 #配置是否启动自动加载数据库内的定时任务,默认true org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true #是否设置为守护线程,设置后任务将不会执行 #org.quartz.threadPool.makeThreadsDaemons=true #持久化方式配置 #JobDataMaps是否都为String类型 org.quartz.jobStore.useProperties=true #数据表的前缀,默认QRTZ_ org.quartz.jobStore.tablePrefix=QRTZ_ #最大能忍受的触发超时时间 org.quartz.jobStore.misfireThreshold=60000 #是否以集群方式运行 org.quartz.jobStore.isClustered=true #调度实例失效的检查时间间隔,单位毫秒 org.quartz.jobStore.clusterCheckinInterval=2000 #数据保存方式为数据库持久化 org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX #数据库代理类,一般org.quartz.impl.jdbcjobstore.StdJDBCDelegate可以满足大部分数据库 org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate #数据库别名 随便取 org.quartz.jobStore.dataSource=qzDS #数据库连接池,将其设置为druid org.quartz.dataSource.qzDS.connectionProvider.class=com.example.cluster.quartz.config.DruidConnectionProvider #数据库引擎 org.quartz.dataSource.qzDS.driver=com.mysql.cj.jdbc.Driver #数据库连接 org.quartz.dataSource.qzDS.URL=jdbc:mysql://127.0.0.1:3306/test-quartz?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true #数据库用户 org.quartz.dataSource.qzDS.user=root #数据库密码 org.quartz.dataSource.qzDS.password=123456 #允许最大连接 org.quartz.dataSource.qzDS.maxConnection=5 #验证查询sql,可以不设置 org.quartz.dataSource.qzDS.validationQuery=select 0 from dual
4.4、注册 Quartz 任务工厂
@Component public class QuartzJobFactory extends AdaptableJobFactory { @Autowired private AutowireCapableBeanFactory capableBeanFactory; @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { //调用父类的方法 Object jobInstance = super.createJobInstance(bundle); //进行注入 capableBeanFactory.autowireBean(jobInstance); return jobInstance; } }
4.5、注册调度工厂
@Configuration public class QuartzConfig { @Autowired private QuartzJobFactory jobFactory; @Bean public SchedulerFactoryBean schedulerFactoryBean() throws IOException { //获取配置属性 PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties")); //在quartz.properties中的属性被读取并注入后再初始化对象 propertiesFactoryBean.afterPropertiesSet(); //创建SchedulerFactoryBean SchedulerFactoryBean factory = new SchedulerFactoryBean(); factory.setQuartzProperties(propertiesFactoryBean.getObject()); factory.setJobFactory(jobFactory);//支持在JOB实例中注入其他的业务对象 factory.setApplicationContextSchedulerContextKey("applicationContextKey"); factory.setWaitForJobsToCompleteOnShutdown(true);//这样当spring关闭时,会等待所有已经启动的quartz job结束后spring才能完全shutdown。 factory.setOverwriteExistingJobs(false);//是否覆盖己存在的Job factory.setStartupDelay(10);//QuartzScheduler 延时启动,应用启动完后 QuartzScheduler 再启动 return factory; } /** * 通过SchedulerFactoryBean获取Scheduler的实例 * @return * @throws IOException * @throws SchedulerException */ @Bean(name = "scheduler") public Scheduler scheduler() throws IOException, SchedulerException { Scheduler scheduler = schedulerFactoryBean().getScheduler(); return scheduler; } }