利用spring的timer和quartz进行任务调度

 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>
 
这也只是任务调度的简单的使用,这要根据具体的需要和业务对其进行扩展.比如,个人日程安排等等,定时邮件发送等等.
 
就到这里了 ,谢谢大家.
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值