1,   内容简介

所谓的定时调度,是指在无人值守的时候系统可以在某一时刻执行某些特定的功能采用的一种机制,对于传统的开发而言,定时调度的操作分为两种形式:

定时触发:到某一时间点上执行某些处理操作;

间隔触发:每隔几秒后进行某些操作的自动处理。

所有的处理都依赖于计算机系统底层的时钟发生器,在java最初的实现过程里面,真对于定时处理专门提供有两个类:Timer,TimerTask两个类,其中TimerTask主要是定义任务的执行,相当于启动一个线程去执行某些任务。

public class MyTask extends TimerTask{

@Override

public void run() {//定义要执行的任务

// TODO Auto-generated method stub

String currentTime=new  SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());

System.out.println(currentTime);

}

}

public class MyTaskTest {

public static void main(String[] args) {

Timer timer=new Timer();

timer.schedule(new MyTask(), 1000);//启动任务,延迟1秒后执行。

}

}

但是,如果要求要在每年的某月某时某分某秒执行某个任务,使用Timer和TimerTask就无能为力了。在项目开发中往往会有两种定时控制的选择:

quartz组件:企业及定时调度组件,需要单独配置;

SpringTask:轻量级组件,配置简单,可以利用Annotation实现配置处理。

2,Quartz定义定时调度

使用Quartz组件,我们需要导入quartz的开发包,在pom.xml中添加quartz的开发包。

<dependency>

<groupId>org.quartz-scheduler</groupId>

<artifactId>quartz</artifactId>

<version>2.2.3</version>

</dependency>

引入包后,就可以进行定时调度的开发了。

有两种实现模式:

去继承QuartzJobBean父类;

直接利用配置就可以实现方法的调度控制。

1,继承一个父类实现任务的处理。

public class MyTask2 extends QuartzJobBean{

@Override

protected void executeInternal(JobExecutionContext context) throws JobExecutionException {

// TODO Auto-generated method stub

String currentTime=new  SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date());

System.out.println(currentTime);

System.out.println("具体的任务实现!!!");

}

}

所有的定时调度的启用都要在Spring的控制文件中完成,即,不需要去写一个明确的类来进行定时任务启用。

2,在applicationContext.xml文件中增加定时调度的配置,通过定时调度工厂类实现。

<bean id="taskFactory"

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

<property name="jobClass" value="cn.wnh.timerSask.MyTask1" />

<property name="jobDataMap">

<map>

<entry key="timeout" value="0" />

</map>

</property>

</bean>

随后配置任务的触发作业,对于作业的配置有两类:

使用间隔触发:若干时间之后重复执行;

工厂类:org.springframework.scheduling.quartz.SimpleTriggerFactoryBean

<bean id="simpleTrigger"

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

<!-- 定义间隔触发的执行程序类 -->

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

<!-- 设置定时触发延迟时间 -->

<property name="startDelay" value="0"></property>

<!-- 单位是”毫秒“ -->

<property name="repeatInterval" value="2000"></property>

</bean>

设置间隔触发调度器:org.springframework.scheduling.quartz.SchedulerFactoryBean

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

<property name="triggers">

<list>

<ref bean="simpleTrigger" />

</list>

</property>

</bean>

3,此时所有的间隔触发控制都交由Spring管理了,现在只需要启动Spring容器即可实现间隔触发任务。

使用Cron实现定时触发

Quartz不仅可以实现间隔触发,它还可以结合Cron实现定时触发,这也是它最重要的功能。

一般项目中使用最多的模式:小时触发,月初触发,年初触发。

修改之前的间隔触发配置,使用CronTriggerFactoryBean实现定时触发。

<bean id="taskFactory"

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

<property name="jobClass" value="cn.wnh.timerSask.MyTask1" />

<property name="jobDataMap">

<map>

<entry key="timeout" value="0" />

</map>

</property>

</bean>

<bean id="cronTrigger"

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

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

<!-- cron表达式,描述每分钟触发一次 -->

<property name="cronExpression" value="0 * * * * ?" />

</bean>

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

<property name="triggers">

<list>

<ref bean="cronTrigger" />

</list>

</property>

</bean>

启动Spring容器即可实现。

2,不继承任何类实现定时调度

在项目开发中,继承直接会导致单继承的局限控制,所以在这种情况下Spring中提供了一种可以不继承任何类即可实现定时操作的任务处理。

定义一个任务执行类,不继承任何类。

public class MyTask2 {

public void taskSelf(){

String task=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new java.util.Date());

System.out.println(task);

System.out.println("执行具体任务操作");

}

}

在applicationContext.xml在配置工厂类:org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

<bean id="taskFactory2"

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

<property name="targetObject">

<bean class="cn.wnh.timerSask.MyTask2" />

</property>

<!--配置要执行的方法 -->

<property name="targetMethod" value="taskSelf" />

</bean>

随后在任务调度配置上配置新的程序类

<bean id="cronTrigger"

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

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

<!-- cron表达式,描述每分钟触发一次 -->

<property name="cronExpression" value="* * * * * ?" />

</bean>

启动容器即可实现定时调度。

这种模式没有类的继承依赖,处理会更加灵活。

Spring Task实现定时调度

在Spring中自己有对定时调度的支持,使用起来感觉比Quartz还要好用。

它有两种实现方式,1,在applicationContext.xml中配置实现;2,使用Annotation实现。

不过使用什么模式,必须先有一个任务处理类。

定义任务处理类。

这里直接使用之前的MyTask2类,不再重复写。

修改applicationContext.xml文件:

需要追加task处理的命名空间定义:

xmlns:task="http://www.springframework.org/schema/task"

http://www.springframework.org/schema/task

http://www.springframework.org/schema/task/spring-task-4.1.xsd

1配置task操作的配置,实现间隔触发。

<bean id="myTask" class="cn.wnh.timerSask.MyTask2" />

<task:scheduled-tasks>

<task:scheduled ref="myTask" method="taskSelf"

fixed-rate="2000" />

</task:scheduled-tasks>

使用cron实现定时触发

<bean id="myTask" class="cn.wnh.timerSask.MyTask2" />

<task:scheduled-tasks>

<task:scheduled ref="myTask" method="taskSelf" cron="* * * * * ?" />

</task:scheduled-tasks>

可见,SpringTask实现起来更加简单。

Spring中实现定时调度的更多相关文章

  1. spring中的定时调度实现TimerFactoryBean引起的隐患

    手中的一个老项目,其中使用的TimerFactoryBean实现的调度任务.一般都是spring quartz实现,这种的着实少见.正因为少见资料比较少,当初为了确认这个会不会2个调度任务同时并行执行 ...

  2. Spring中的定时调度(Scheduling)和线程池(Thread Pooling)

    使用triggers和SchedulerFactoryBean来包装任务 我们已经创建了job details,jobs.我们同时回顾了允许你调用特定对象上某一个方法的便捷的bean. 当然我们仍需要 ...

  3. Spring使用@Scheduled定时调度

    一.spring配置文件中增加对这个注解的支持: 配置文件如下: <?xml version="1.0" encoding="UTF-8"?> &l ...

  4. Spring中使用Schedule调度

    在spring中两种办法使用调度,以下使用是在spring4.0中. 一.基于application配置文件,配置入下: <bean id="jobDetail" class ...

  5. spring中的定时任务调度用例

    在application-quartz.xml配置文件中添加如下配置信息: <!-- Quartz -->     <bean id="getSendEmailObject ...

  6. JAVA中的定时调度(Timer和TimerTask)

    某些时候我们需要定时去完成一些任务,这里举一个例子:我们需要在3秒钟后打印当前系统时间,此后每隔5秒重复此操作.代码如下: import java.util.TimerTask; import jav ...

  7. Spring使用Quartz定时调度Job无法Autowired注入Service的解决方案

    1)自定义JobFactory,通过spring的AutowireCapableBeanFactory进行注入,例如: public class MyJobFactory extends  org.s ...

  8. Java中的定时调度

    Timer类是一个线程设施,用于实现在某个时间或者某一段时间后安排某个任务执行一次或者定期重复执行.需要与TimerTask配合使用. TimerTask类用来实现由Timer安排的一次或重复执行的某 ...

  9. Spring Quartz定时调度任务配置

    applicationContext-quartz.xml定时调度任务启动代码: <?xml version="1.0" encoding="UTF-8" ...

随机推荐

  1. Memcached和Redis简介

    前言: 目前比较流行的缓存技术无疑是Memcached和Redis,两套缓存技术有着诸多的相似之处,但又具备大量的显著差异,作为新生的方案,Redis被视为首选,但是有些场景Memcached发挥的作 ...

  2. 开涛spring3(6.4) - AOP 之 6.4 基于@AspectJ的AOP

    Spring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明. 6.4.1  启用对@AspectJ的支持 Spring默认不支持@AspectJ风格的切面声明, ...

  3. 一、 开篇(ASP.NET MVC5 系列)

    这个教程将教你一些用VS2013创建ASP.NET MVC 5 Web应用程序基础知识.为了避免开发工具的不一致而带来的一些小麻烦,建议你使用和我一样的开发工具VS2013英文版. 开发工具:Visu ...

  4. linux 命令(alias , unalias , install ,ar , arch ,uname )

    https://linux.die.net/man/ http://man.linuxde.net/ user commands 1.alias [ˈālēəs]:别名 alias --help al ...

  5. Neo4j 第五篇:批量更新数据

    相比图形数据的查询,Neo4j更新图形数据的速度较慢,通常情况下,Neo4j更新数据的工作流程是:每次数据更新都会执行一次数据库连接,打开一个事务,在事务中更新数据.当数据量非常大时,这种做法非常耗时 ...

  6. 谷歌安装器扫描时提示“需要root权限”,不用root也可以的!

    能FQ的用户会用谷歌服务,一般的新手机没有安装谷歌框架,但是在用谷歌安装器安装谷歌市场时会提示"需要root权限",我用的是360手机,按照下面的教程搞好了: 安装完GSM包就可以 ...

  7. 传统平面广告已OUT出局,VR全景异军突起——VR全景智慧城市

    VR,近两年异军突起的"黑科技".从1935年斯坦利·温鲍姆首次在小说中描述VR眼镜,到如今PC头盔.VR分体机以及VR一体机的相继问世,VR自身已从虚拟走向现实.而当硬件迭代逐步 ...

  8. 逆向libbaiduprotect(四)

    百度加固libbaiduprotect.so自身对只读字符串进行了加密保护,防止成为破解和逆向的切入口.一般地认为,只要找出这个解密算法就可以对.rodata段的只读字符串进行破解,从而窥探程序的意图 ...

  9. 加载jquery插件注意了

    1.尽量放在</body>之前,不要放在</head>标签之前,如果执意要放也要放在css之后,例如: <link href="style.css" ...

  10. nodejs实战:使用原生nodeJs模块实现静态文件及REST请求解析及响应(基于nodejs6.2.0版本,不使用express等webMVC框架 )

    一.准备工作 1.安装nodejs 首先你需要安装nodeJs 那么nodejs官网:http://nodejs.cn/,下载相应版本,一步一步安装. 二.使用nodejs开发服务器后台应用 1.创建 ...