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

如何在quartz的job任务中 *** 作数据库,第1张

数据库中建表。建表模版在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信息

quartz定时任务配置:

<bean id="scheduler"

class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

<property name="triggers">

<list>

<ref bean="ActionCronTrigger"/>

<ref bean="ActionOrderCronTrigger"/>

<ref bean="InquiryCronTrigger"/>

</list>

</property>

</bean>

其中:

<ref bean="ActionCronTrigger"/>

<ref bean="ActionOrderCronTrigger"/>

<ref bean="InquiryCronTrigger"/>

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

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

public class InitCronTriggerFactoryBean extends CronTriggerFactoryBean implements Serializable {

private static final long serialVersionUID = 1L

private SysParamServiceImpl sysParamServiceImpl

private String key

public void setKey(String key)

{

this.key = key

}

public void setSysParamServiceImpl(SysParamServiceImpl sysParamServiceImpl)

{

this.sysParamServiceImpl = sysParamServiceImpl

setCronExpression(getCronExpressionFromDB())

}

private String getCronExpressionFromDB()

{

if(StringUtils.isEmpty(key))

return "0 0 0/1 * * ?"

SysParam sysParam = new SysParam()

try

{

sysParam = sysParamServiceImpl.getNameByKey(key)

}

catch (Exception e)

{

e.printStackTrace()

}

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

return sysParam.getParamValue()

return "0 0 0/1 * * ?"

}

}

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

spring配置CronTriggerFactoryBean:

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

<bean id="InquiryCronTrigger" class="cn.com.shopec.quartz.utils.InitCronTriggerFactoryBean">

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

<property name="key" value="inquiryQuartzParam" />

<property name="sysParamServiceImpl" ref="sysParamServiceImpl" />

</bean>

id对应quartz定时任务配置的<ref bean="InquiryCronTrigger"/>,参数有三个,第二个和第三个是InitCronTriggerFactoryBean设置内容需要的,第一个<property name="jobDetail" ref="InquiryJobDetail" />则是定时任务执行业务逻辑的类

ps:<property name="sysParamServiceImpl" ref="sysParamServiceImpl" />,这个要配置对应的bean,我的是

<bean id="sysParamServiceImpl" class="cn.com.shopec.core.system.service.impl.SysParamServiceImpl">

</bean>

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

<bean id="InquiryJobDetail"

class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

<property name="durability" value="true" />

<property name="jobClass" value="cn.com.shopec.quartz.utils.InquiryQuartz" />

<property name="jobDataAsMap">

<map>

<entry key ="inquiryServiceImpl" value-ref="inquiryServiceImpl"/>

</map>

</property>

</bean>

简单说明一下:<property name="jobClass" value="cn.com.shopec.quartz.utils.InquiryQuartz" />配置的是你需要定时执行的类,<property name="jobDataAsMap">下面配置的是定时执行类中需要用到的其他类,这是由于项目启动执行定时任务不能在定时任务类中实例化这些类,要配置才行。

对应的定时任务执行类:

public class InquiryQuartz extends QuartzJobBean {

@Autowired

private InquiryServiceImpl inquiryServiceImpl

@Override

protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException

{

// 实例化接口

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

// 执行业务方法

quartzStart()

}

public void quartzStart(){

// 业务方法...

}

}

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

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


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存