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

spring配置quartz后怎么访问数据库,第1张

quartz定时任务配置:

class="orgschelingquartz"

其中:

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

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

publicclassextendsimplements{

privatestaticfinallong=1L;

privatesysParamServiceImpl;

privateStringkey;

publicvoidsetKey(Stringkey)

{

thiskey=key;

}

publicvoidsetSysParamServiceImpl(SysParamServiceImplsysParamServiceImpl)

{

thissysParamServiceImpl=sysParamServiceImpl;

setCronExpression(getCronExpressionFromDB());

}

privateStringgetCronExpressionFromDB()

{

if(StringUtilsisEmpty(key))

return"000/1";

SysParamsysParam=newSysParam();

try

{

sysParam=sysParamServiceImplgetNameByKey(key);

}

catch(Exceptione)

{

eprintStackTrace();

}

if(sysParam!=null&&!StringUtilsisEmpty(sysParamgetParamValue()))

returnsysParamgetParamValue();

return"000/1";

}

}

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

spring配置CronTriggerFactoryBean:

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

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

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

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

class="orgspringframeworkschelingquartzJobDetailFactoryBean"

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

对应的定时任务执行类:

publicclassInquiryQuartzextendsQuartzJobBean{

@Autowired

privateInquiryServiceImplinquiryServiceImpl;

@Override

protectedvoidexecuteInternal(JobExecutionContextarg0)throwsJobExecutionException

{

//实例化接口

inquiryServiceImpl=(InquiryServiceImpl)arg0getJobDetail()getJobDataMap()get("inquiryServiceImpl");

//执行业务方法

quartzStart();

}

publicvoidquartzStart(){

//业务方法

}

}

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

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

Quartz集群中的每个节点是一个独立的Quartz应用,它又管理其它的节点。

需要分别对每个节点分别启动或停止。不像应用服务器的集群,独立的Quartz节点并不与另一个节点或是管理节点通信。

Quartz应用是通过数据库表来感知到另一应用。

Quartz应用定时15秒同步一次心跳到数据库。

Quartz通过数据库行锁来解决分布式环境下数据一致性问题。

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

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

生成的表结构

3、在springboot项目中配置quartz。

31、两种方式配置quartz,

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

orgquartzjobStoreuseProperties:true

#orgquartzschedulerinstanceName: quartzScheduler

#orgquartzschedulerinstanceId = AUTO

orgquartzthreadPoolclass = orgquartzsimplSimpleThreadPool

orgquartzthreadPoolthreadCount = 15

orgquartzthreadPoolthreadPriority: 5

orgquartzthreadPoolthreadsInheritContextClassLoaderOfInitializingThread: true

orgquartzjobStoreclass = orgquartzimpljdbcjobstoreJobStoreTX

orgquartzjobStoredriverDelegateClass=orgquartzimpljdbcjobstoreStdJDBCDelegate

orgquartzjobStoreisClustered = false

#orgquartzjobStoreclusterCheckinInterval=20000

orgquartzjobStoretablePrefix = qrtz_

orgquartzjobStoremisfireThreshold = 60000

orgquartzjobStoremaxMisfiresToHandleAtATime = 20

orgquartzschedulerrmiexport: false

orgquartzschedulerrmiproxy: false

orgquartzschedulerwrapJobExecutionInUserTransaction: false

登录后复制

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

@Configuration

public class SchedulerConfig implements SchedulerFactoryBeanCustomizer {

@Autowired

private DataSource dataSource;

@Override

public void customize(SchedulerFactoryBean schedulerFactoryBean) {

schedulerFactoryBeansetStartupDelay(10);

schedulerFactoryBeansetOverwriteExistingJobs(true);

schedulerFactoryBeansetDataSource(dataSource);

ClassPathResource resource = new ClassPathResource("quartzproperties");

Properties properties = new Properties();

InputStream in= null;

try {

in = resourcegetInputStream();

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

propertiesload(bf);

schedulerFactoryBeansetQuartzProperties(properties);

} catch (IOException e) {

eprintStackTrace();

}

}

}

登录后复制

321、第二种方式是在applicationproperties文件中的配置,applicationproperties文件中的springquartzproperties 加上quartzproperties中的键值对,效果与quartzproperties类似。

springquartzpropertiesorgquartzjobStoretablePrefix = qrtz_

springquartzpropertiesorgquartzthreadPoolthreadCount = 10

登录后复制

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

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

322 自定义配置springboot中的SchedulerFactoryBean。

@Configuration

public class SchedulerConfig implements SchedulerFactoryBeanCustomizer {

@Autowired

private DataSource dataSource;

@Override

public void customize(SchedulerFactoryBean schedulerFactoryBean) {

schedulerFactoryBeansetStartupDelay(10);

schedulerFactoryBeansetOverwriteExistingJobs(true);

schedulerFactoryBeansetDataSource(dataSource);

}

}

登录后复制

4、新建Job

public class TestJob implements Job {

@Override

public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

Systemoutprintln(SystemnanoTime());

}

}

登录后复制

5、数据库中新增job任务脚本,comexamplequartzdemojobTestJob是我本地的测试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, 'comexamplequartzdemojobTestJob', '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、启动项目,查看控制台打印的日志,成功

1、quartz表达式介绍

Cron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,细说如下:

(1)星号():可用在所有字段中,表示对应时间域的每一个时刻,例如,在分钟字段时,表示“每分钟”;

(2)问号():该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符;

(3)减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;

(4)逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;

(5)斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用/y,它等同于0/y;

2、QuartzNET是一个开源的作业调度框架,是 OpenSymphony 的 Quartz API 的NET移植,它用C#写成,可用于winform和aspnet应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等,比如:表示式: 0 0 12 ? 表示:每天的12点调用。

3、Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 232。

spring

quartz如何动态配置时间

1

目的:动态设置时间,触发相应的任务

2

系统架构为

struts

+

spring

+

hibernate

3

实现步骤:

在页面上设置时间;

将时间转换为unix

cron

expression;

将转换后的时间规则表达式记录到数据库中(也可以写

有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz。

1Java Timer定时

首先继承javautilTimerTask类实现run方法

import javautilTimerTask;

public class EmailReportTask extends TimerTask{

@Override

public void run() {

}

}

在Spring定义

配置Spring定时器

<bean id="scheduleReportTask" class="orgspringframeworkschedulingtimerScheduledTimerTask">

<property name="timerTask" ref="reportTimerTask" />

<property name="period">

<value>86400000value>

property>

bean>

timerTask属性告诉ScheduledTimerTask运行哪个。86400000代表24个小时

启动Spring定时器

Spring的TimerFactoryBean负责启动定时任务

<bean class="orgspringframeworkschedulingtimerTimerFactoryBean">

<property name="scheduledTimerTasks">

<list><ref bean="scheduleReportTask"/>list>

property>

bean>

scheduledTimerTasks里显示一个需要启动的定时器任务的列表。

可以通过设置delay属性延迟启动

<bean id="scheduleReportTask" class="orgspringframeworkschedulingtimerScheduledTimerTask">

<property name="timerTask" ref="reportTimerTask" />

<property name="period">

<value>86400000value>

property>

<property name="delay">

<value>3600000value>

property>

bean>

这个任务我们只能规定每隔24小时运行一次,无法精确到某时启动

2Quartz定时器

首先继承QuartzJobBean类实现executeInternal方法

import orgquartzJobExecutionContext;

import orgquartzJobExecutionException;

import orgspringframeworkschedulingquartzQuartzJobBean;

public class EmailReportJob extends QuartzJobBean{

protected void executeInternal(JobExecutionContext arg0)

throws JobExecutionException {

}

}

在Spring中定义

<bean id="reportJob" class="orgspringframeworkschedulingquartzJobDetailBean">

<property name="jobClass">

<value>EmailReportJobvalue>

property>

<property name="jobDataAsMap">

<map>

<entry key="courseService">

<ref bean="courseService"/>

entry>

map>

property>

bean>

在这里我们并没有直接声明一个EmailReportJob Bean,而是声明了一个JobDetailBean。这个是Quartz的特点。JobDetailBean是Quartz的orgquartzJobDetail的子类,它要求通过jobClass属性来设置一个Job对象。

使用Quartz的JobDetail中的另一个特别之处是EmailReportJob的courseService属性是间接设置的。JobDetail的jobDataAsMap属性接受一个Map,包括设置给jobClass的各种属性,当。JobDetailBean实例化时,它会将courseService Bean注入到EmailReportJob 的courseService 属性中。

启动定时器

Quartz的orgquartzTrigger类描述了何时及以怎样的频度运行一个Quartz工作。Spring提供了两个触发器SimpleTriggerBean和CronTriggerBean。

SimpleTriggerBean与scheduledTimerTasks类似。指定工作的执行频度,模仿scheduledTimerTasks配置

<bean id="simpleReportTrigger" class="orgspringframeworkschedulingquartzSimpleTriggerBean">

<property name="jobDetail" ref="reprotJob" />

<property name="startDelay">

<value>360000value>

property>

<property name="repeatInterval">

<value>86400000value>

property>

bean>

startDelay也是延迟1个小时启动

CronTriggerBean指定工作的准确运行时间

<bean id="cronReportTrigger" class="orgspringframeworkschedulingquartzCronTriggerBean">

<property name="jobDetail" ref="reprotJob" />

<property name="cronExpression">

<value>0 0 6 value>

property>

bean>

属性cronExpression告诉何时触发。最神秘就是cron表达式:

Linux系统的计划任务通常有cron来承担。一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。从左到右:

1秒2分3小时4月份中的日期(1-31)5月份(1-12或JAN-DEC)6星期中的日期(1-7或SUN-SAT)7年份(1970-2099)

每个元素都显示的规定一个值(如6),一个区间(9-12),一个列表(9,11,13)或一个通配符()。因为4和6这两个元素是互斥的,因此应该通过设置一个问号(?)来表明不想设置的那个字段,“/”如果值组合就表示重复次数(10/6表示每10秒重复6次)。

启动定时器

<bean class="orgspringframeworkschedulingquartzSchedulerFactoryBean">

<property name="triggers">

<list><ref bean="cronReportTrigger"/>list>

property>

bean>

triggers属性接受一组触发器。

以下就对两种定时任务框架进行简单说明。

github地址:>

以上就是关于spring配置quartz后怎么访问数据库全部的内容,包括:spring配置quartz后怎么访问数据库、quartz为什么不在同一个节点上执行、springboot+quartz持久化到数据库各表含义等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存