Java中定时任务quartz如何将历史数据写入新表

Java中定时任务quartz如何将历史数据写入新表,第1张

我建议的做法是在数据库中建一些Quartz的表,MySQL的建、删表脚本,最主要的修改是quartz.properties,如果你使用的是其他数据库,可以下载Quartz的distribution,在\docs\dbTables下。然后我们可以启动Bootstrap类,注册、运行定时任务。你可以发现MySQL的表中已经有此定时任务的记录了。

然后你可以停止Bootstrap类,将Bootstrap类中关于注册、启动定时任务的代码删除或注释,然后启动Bootstrap类,看上一次 *** 作注册的定时任务会不会继续运行。

如无意外,看上一次 *** 作注册的定时任务会继续运行。

首先你应该使用的是持久化的quartz,所有定时任务的情况都是保存在数据库表总的,每次启动时,scheduler容器都是按照qrtz_triggers等表内存储的信息来执行定时任务(主要包括cron表达式,上一次执行时间) 你只要修改持久化表中相应的表达式即可,以下的信息希望能帮到你

QRTZ_CALENDARS 以 Blob 类型存储 Quartz 的 Calendar 信息

QRTZ_CRON_TRIGGERS 存储 Cron Trigger,包括 Cron表达式和时区信息

QRTZ_FIRED_TRIGGERS 存储与已触发的 Trigger 相关的状态信息,以及相联 Job的执行信息 QRTZ_PAUSED_TRIGGER_GRPS 存储已暂停的 Trigger 组的信息

QRTZ_SCHEDULER_STATE 存储少量的有关 Scheduler 的状态信息,和别的 Scheduler实例(假如是用于一个集群中)

QRTZ_LOCKS 存储程序的悲观锁的信息(假如使用了悲观锁)

QRTZ_JOB_DETAILS 存储每一个已配置的 Job 的详细信息

QRTZ_JOB_LISTENERS 存储有关已配置的 JobListener 的信息

QRTZ_SIMPLE_TRIGGERS 存储简单的Trigger,包括重复次数,间隔,以及已触的次数

QRTZ_BLOG_TRIGGERS Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)

QRTZ_TRIGGER_LISTENERS 存储已配置的 TriggerListener 的信息

QRTZ_TRIGGERS 存储已配置的 Trigger 的信息

表qrtz_job_details: 保存job详细信息,该表需要用户根据实际情况初始化

job_name:集群中job的名字,该名字用户自己可以随意定制,无强行要求

job_group:集群中job的所属组的名字,该名字用户自己随意定制,无强行要求

job_class_name:集群中个note job实现类的完全包名,quartz就是根据这个路径到classpath找到该job类

is_durable:是否持久化,把该属性设置为1,quartz会把job持久化到数据库中

job_data:一个blob字段,存放持久化job对象

表qrtz_triggers: 保存trigger信息

trigger_name: trigger的名字,该名字用户自己可以随意定制,无强行要求

trigger_group:trigger所属组的名字,该名字用户自己随意定制,无强行要求

job_name: qrtz_job_details表job_name的外键

job_group: qrtz_job_details表job_group的外键

trigger_state:当前trigger状态,设置为ACQUIRED 表示正在执行,如果设置为WAITING,则job会等待被触发

trigger_cron:触发器类型,使用cron表达式

表qrtz_cron_triggers:存储cron表达式表

trigger_name: qrtz_triggers表trigger_name的外键

trigger_group: qrtz_triggers表trigger_group的外键

cron_expression:cron表达式

表qrtz_scheduler_state:存储集群中note实例信息,quartz会定时读取该表的信息判断集群中每个实例的当前状态

instance_name:之前配置文件中org.quartz.scheduler.instanceId配置的名字,就会写入该字段,如果设置为AUTO,quartz会根据物理机名和当前时间产生一个名字

last_checkin_time:上次检查时间

checkin_interval:检查间隔时间

1、去quartz官网下载quartz2.2.2版本的压缩包,quartz下载,注意:quartz2.3.0版本的在docs目录下没有发现dbtable目录(存放生成数据库表的sql文件的目录)。

2、执行创建数据库表的sql文件,我使用的是mysql数据库。

生成的表结构

3、在springboot项目中配置quartz。

3.1、两种方式配置quartz,

3.1.1、第一种是使用自定义的quartz.properties,这是简单配置,如果有其他配置可以参考,quartz.properties配置详情

org.quartz.jobStore.useProperties:true

#org.quartz.scheduler.instanceName: quartzScheduler

#org.quartz.scheduler.instanceId = AUTO

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

org.quartz.threadPool.threadCount = 15

org.quartz.threadPool.threadPriority: 5

org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate

org.quartz.jobStore.isClustered = false

#org.quartz.jobStore.clusterCheckinInterval=20000

org.quartz.jobStore.tablePrefix = qrtz_

org.quartz.jobStore.misfireThreshold = 60000

org.quartz.jobStore.maxMisfiresToHandleAtATime = 20

org.quartz.scheduler.rmi.export: false

org.quartz.scheduler.rmi.proxy: false

org.quartz.scheduler.wrapJobExecutionInUserTransaction: false

登录后复制

3.1.2、使用配置文件配置springboot中的SchedulerFactoryBean。

@Configuration

public class SchedulerConfig implements SchedulerFactoryBeanCustomizer {

@Autowired

private DataSource dataSource

@Override

public void customize(SchedulerFactoryBean schedulerFactoryBean) {

schedulerFactoryBean.setStartupDelay(10)

schedulerFactoryBean.setOverwriteExistingJobs(true)

schedulerFactoryBean.setDataSource(dataSource)

ClassPathResource resource = new ClassPathResource("quartz.properties")

Properties properties = new Properties()

InputStream in= null

try {

in = resource.getInputStream()

BufferedReader bf = new BufferedReader(new InputStreamReader(in, "UTF-8"))

properties.load(bf)

schedulerFactoryBean.setQuartzProperties(properties)

} catch (IOException e) {

e.printStackTrace()

}

}

}

登录后复制

3.2.1、第二种方式是在application.properties文件中的配置,application.properties文件中的spring.quartz.properties. 加上quartz.properties中的键值对,效果与quartz.properties类似。

spring.quartz.properties.org.quartz.jobStore.tablePrefix = qrtz_

spring.quartz.properties.org.quartz.threadPool.threadCount = 10

登录后复制

项目中配置org.quartz.jobStore.tablePrefix = qrtz_,这个配置是默认查询数据库中表的前缀,默认是QRTZ_,以下sql中通过rpt方法组装一条新的sql,替换掉{0},{1},如果没有明确声明就会使用默认值 org.quartz.jobStore.tablePrefix = QRTZ_,org.quartz.scheduler.instanceName: quartzScheduler。

如果进行简单的定时任务,可以使用springboot中默认的quartz配置。

3.2.2 自定义配置springboot中的SchedulerFactoryBean。

@Configuration

public class SchedulerConfig implements SchedulerFactoryBeanCustomizer {

@Autowired

private DataSource dataSource

@Override

public void customize(SchedulerFactoryBean schedulerFactoryBean) {

schedulerFactoryBean.setStartupDelay(10)

schedulerFactoryBean.setOverwriteExistingJobs(true)

schedulerFactoryBean.setDataSource(dataSource)

}

}

登录后复制

4、新建Job

public class TestJob implements Job {

@Override

public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

System.out.println(System.nanoTime())

}

}

登录后复制

5、数据库中新增job任务脚本,com.example.quartzdemo.job.TestJob是我本地的测试Job,需要修改成你自己Job类。

INSERT INTO `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `JOB_CLASS_NAME`, `IS_DURABLE`, `IS_NONCONCURRENT`, `IS_UPDATE_DATA`, `REQUESTS_RECOVERY`, `JOB_DATA`) VALUES ('quartzScheduler', 'test2Job', 'testGroup', NULL, 'com.example.quartzdemo.job.TestJob', '1', '0', '0', '0', NULL)

INSERT INTO `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `JOB_NAME`, `JOB_GROUP`, `DESCRIPTION`, `NEXT_FIRE_TIME`, `PREV_FIRE_TIME`, `PRIORITY`, `TRIGGER_STATE`, `TRIGGER_TYPE`, `START_TIME`, `END_TIME`, `CALENDAR_NAME`, `MISFIRE_INSTR`, `JOB_DATA`) VALUES ('quartzScheduler', 'testTrigger2', 'testTriggerGroup', 'test2Job', 'testGroup', NULL, '1554122914000', '1554122913000', '5', 'ACQUIRED', 'CRON', '1554039857000', '0', NULL, '0', NULL)

INSERT INTO `qrtz_cron_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`, `CRON_EXPRESSION`, `TIME_ZONE_ID`) VALUES ('quartzScheduler', 'testTrigger2', 'testTriggerGroup', '0/1 * * * * ?', 'Asia/Shanghai')

登录后复制

6、启动项目,查看控制台打印的日志,成功


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10003439.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存