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持久化到数据库各表含义等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)