java

位置:IT落伍者 >> java >> 浏览文章

Spring定时器的两种实现方式


发布日期:2020年10月11日
 
Spring定时器的两种实现方式

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

Java 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>value>

property>

bean>

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

启动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>value>

property>

<property name=delay>

<value>value>

property>

bean>

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

Quartz定时器

首先继承QuartzJobBean类实现executeInternal方法

import orgquartzJobExecutionContext; import orgquartzJobExecutionException; import orgspringframeworkschedulingquartzQuartzJobBean;

public class EmailReportJob extends QuartzJobBean{

protected void executeInternal(JobExecutionContext arg)

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>value>

property>

<property name=repeatInterval>

<value>value>

property>

bean>

startDelay也是延迟个小时启动

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

<bean id=cronReportTrigger class=orgspringframeworkschedulingquartzCronTriggerBean>

<property name=jobDetail ref=reprotJob />

<property name=cronExpression>

<value> * * ?value>

property>

bean>

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

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

小时月份中的日期()月份(或JANDEC)星期中的日期(或SUNSAT)年份()

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

启动定时器

<bean class=orgspringframeworkschedulingquartzSchedulerFactoryBean>

<property name=triggers>

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

property>

bean>

triggers属性接受一组触发器

上一篇:实用的Java反射工具类

下一篇:将 Java 应用程序迁移到 .NET(2)