首页数据库quartz 数据库?如何在quartz的job任务中操作数据库

quartz 数据库?如何在quartz的job任务中操作数据库

编程之家2023-10-1798次浏览

这篇文章给大家聊聊关于quartz 数据库,以及如何在quartz的job任务中操作数据库对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

quartz 数据库?如何在quartz的job任务中操作数据库

spring配置quartz后怎么访问数据库

quartz定时任务配置:

class="org..scheling.quartz."

其中:

配置对应的定时任务,可配置多个,名称要唯一,对应的是第二步中配置的

配置,由于要实现动态读取定时任务周期时间,所以我们要写一个类实现,类的内容如下:

publicclassextendsimplements{

quartz 数据库?如何在quartz的job任务中操作数据库

privatestaticfinallong=1L;

privatesysParamServiceImpl;

privateStringkey;

publicvoidsetKey(Stringkey)

{

this.key=key;

quartz 数据库?如何在quartz的job任务中操作数据库

}

publicvoidsetSysParamServiceImpl(SysParamServiceImplsysParamServiceImpl)

{

this.sysParamServiceImpl=sysParamServiceImpl;

setCronExpression(getCronExpressionFromDB());

}

privateStringgetCronExpressionFromDB()

{

if(StringUtils.isEmpty(key))

return"000/1**?";

SysParamsysParam=newSysParam();

try

{

sysParam=sysParamServiceImpl.getNameByKey(key);

}

catch(Exceptione)

{

e.printStackTrace();

}

if(sysParam!=null&&!StringUtils.isEmpty(sysParam.getParamValue()))

returnsysParam.getParamValue();

return"000/1**?";

}

}

简单说明一下:key是用来查询数据库配置的CronExpression表达式的查询条件,SysParamServiceImpl是实现查询的类,这几个参数都要从spring配置的CronTriggerFactoryBean参数获取,注意,配置的时候,key值的配置要在SysParamServiceImpl的配置之前,否则报空指针

spring配置CronTriggerFactoryBean:

实现了CronTriggerFactoryBean之后,开始配置CronTriggerFactoryBean,现在配置的是InitCronTriggerFactoryBean:

id对应quartz定时任务配置的,参数有三个,第二个和第三个是InitCronTriggerFactoryBean设置内容需要的,第一个

则是定时任务执行业务逻辑的类

ps:

,这个要配置对应的bean,我的是

配置对应的定时任务执行业务方法的类:

class="org.springframework.scheling.quartz.JobDetailFactoryBean"

简单说明一下:

配置的是你需要定时执行的类,

下面配置的是定时执行类中需要用到的其他类,这是由于项目启动执行定时任务不能在定时任务类中实例化这些类,要配置才行。

对应的定时任务执行类:

publicclassInquiryQuartzextendsQuartzJobBean{

@Autowired

privateInquiryServiceImplinquiryServiceImpl;

@Override

protectedvoidexecuteInternal(JobExecutionContextarg0)throwsJobExecutionException

{

//实例化接口

inquiryServiceImpl=(InquiryServiceImpl)arg0.getJobDetail().getJobDataMap().get("inquiryServiceImpl");

//执行业务方法

quartzStart();

}

publicvoidquartzStart(){

//业务方法...

}

}

说明一下:必须要实现QuartzJobBean接口

至此,就可以完成可配置CronExpression表达式的定时任务了!1

如何在quartz的job任务中操作数据库

数据库中建表。建表模版在Quartz包下docs/dbTables下,选择相应的数据库和版本即可。ORACLE的11个Table列表如下:

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

JOB_NAME

JOB_GROUP

JOB_LISTENER

QRTZ_TRIGGER_LISTENERS:存储已配置的 TriggerListener的信息

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

QRTZ_PAUSED_TRIGGER_GRPS:存储已暂停的 Trigger组的信息

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

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

LAST_CHECKIN_TIME:上次检查时间

CHECKIN_INTERVAL:检查间隔时间

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

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

TRIGGER_NAME:qrtz_triggers表trigger_name的外键

TRIGGER_GROUP:qrtz_triggers表trigger_group的外键

REPEAT_COUNT:重复次数

REPEAT_INTERVAL:时间间隔

TIMES_TRIGGERED:触发次数

QRTZ_CRON_TRIGGERS:存储cron表达式表

TRIGGER_NAME:qrtz_triggers表trigger_name的外键

TRIGGER_GROUP:qrtz_triggers表trigger_group的外键

CRON_EXPRESSION:cron表达式

TIME_ZONE_ID:时区

QRTZ_TRIGGERS:保存trigger信息

springboot+quartz持久化到数据库各表含义

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、启动项目,查看控制台打印的日志,成功

好了,关于quartz 数据库和如何在quartz的job任务中操作数据库的问题到这里结束啦,希望可以解决您的问题哈!

服务器域名解析?怎样将域名解析到服务器上。剑走偏锋?剑走偏锋 什么意思