jdk提供对timer的支持,timer通过线程不停的将当前时间与服务器时间比较,如时间相同,则执行相应的方法.
class MyJob extends
TimerTask{
public void run() {
System.out.println("哈哈哈");
}
在时间相等的情况下,执行timertask的run()方法.
//设置为守护线程
Timer timer = new Timer(true);
//固定时间执行
timer.schedule(new MyJob(), new
Date(108,5,31));
//重复时间执行
timer.schedule(new MyJob(), new
Date(108,3000,1000));
|
timer提供固定时间执行,和重复时间执行两种调度机制.
spring对timer进行封装.
<bean id="gf2"
class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!-- 延迟时间 -->
<property name="delay"
value="3000"></property>
<!-- 间隔时间 -->
<property name="period"
value="10000"></property>
<!-- 任务 -->
<property
name="timerTask">
<bean
class="com.heaven.quartz.MyTask">
<property
name="who" value="女朋友"/>
</bean>
</property>
</bean>
<bean id="timerFactory"
class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="daemon"
value="true"/>
<property
name="scheduledTimerTasks">
<list>
<ref
bean="gf"/>
</list>
</property>
</bean> |
显然com.heaven.quartz.MyTask继承TimerTask,只要实现run方法就OK了.
当然,你也可以自己重新对ScheduledTimerTask进行实现.
timer只能做到固定时间执行,或者等长间隔时间执行.如果需要在每月15号执行,这是很困难的事,因为每月时间并不是定长的,当然你也可以在timer中加入多个固定时间的任务,但在很多时候并不能符合自己的要求.
而quartz解决了这一系列的问题.但你需要quartz.jar这个包,spring带的有.
Scheduler schd = new
StdSchedulerFactory().getScheduler();
schd.start();
JobDetail details =new
JobDetail("firstJob",Scheduler.DEFAULT_GROUP,FirstJob.class);
Map map =
details.getJobDataMap();
map.put("haha",
"任务开始....");
//利用cron表达式进行时间的匹配
String cronExp = "1/3 * 11,12 *
* ?";
Trigger trigger = new
CronTrigger("cronTrigger",Scheduler.DEFAULT_GROUP,cronExp);
/*
//当前时间为开始时间结束时间不存在
null 3000间隔
Trigger trigger = new
SimpleTrigger("simpleTrigger",Scheduler.DEFAULT_GROUP,
new
Date(),null,SimpleTrigger.REPEAT_INDEFINITELY,3000);
*/
schd.scheduleJob(details,
trigger);
}
|
通过StdSchedulerFactory获得Scheduler,然后实例化JobDetail,这时候需要任务执行类FirstJob,此类继承Job类,并实现excute()方法,类似于timerTask.
public class FirstJob implements Job {
public void execute(JobExecutionContext context)
throws JobExecutionException {
// TODO 自动生成方法存根
System.out.println(context.getJobDetail().getJobDataMap().get("haha"));
System.out.println("下个任务的时间是:"+context.getNextFireTime().toLocaleString());
}
}
|
接下来需要做的是,设置其触发器及触发时间了.quartz提供两种触发器,SimpleTrigger和CronTrigger,对我们有用的就是CronTrigger这个触发器了.
它支持cron表达式.
Cron表达式的组成.秒 分 小时 日期 月 星期 年
符号:
"*" 任意值,
"?" 无特定值,
"-" 范围,
","列分割符,
"/"增量值,
"L"最后一个,
"#"星期,如2#3,每月第2个星期3
"C*"日期和星期中使用,
如,8/10 3,5 10-12,*,5L,?
每10秒增量,每分钟第8秒,每小时第3,5分钟,每天10-12点,每月,每月的最后一个周4,无固定年份,将激活触发器执行.
schd.scheduleJob(details, trigger);
将任务和触发器加入scheduer中.就OK.
在spring中的使用:
<!-- job-->
<bean id="job"
class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass"
value="com.heaven.quartz.FirstJob"/>
<property
name="jobDataAsMap">
<map>
<entry
key="haha" value="任务执行"/>
</map>
</property>
</bean>
<!--trigger-->
<bean id="cronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail"
ref="job"/>
<property
name="cronExpression" value="1/3 * 11,12 * * ?"/>
</bean>
<!--scheduleFactory-->
<bean
id="scheduleFactory"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property
name="triggers">
<list>
<ref
bean="cronTrigger"/>
</list>
</property>
<!--<property
name="dataSource" ref="ds"/>-->
</bean>
|
Quartz也可以对任务进行持久化,也就是在服务器关闭的时候,将任务持久化到数据库,在服务器再次启动,将重新进行任务的调度.由于不知道其默认的数据表结构,也没去研究它,所有就没搞了.但有需要的化,自己可以根据自己的数据表结果,进行任务持久化的扩展也可以.
<bean id="ds"
class="org.springframework.jdbc.datasource.SingleConnectionDataSource">
<property
name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/test"/>
<property name="username"
value="root"/>
<property name="password"
value="root"/>
</bean> |
这也只是任务调度的简单的使用,这要根据具体的需要和业务对其进行扩展.比如,个人日程安排等等,定时邮件发送等等.
就到这里了 ,谢谢大家.