springMVC + quartz实现定时器(任务调度器)
本文内容纲要:
闲来无事,写了点东西,话不多说先记录下来。防止以后需要用到。
首先我们要知道任务调度器(定时器)有几种,这边我会写三种
第一种是基于JDK的本身的一个定时器(优点:简单,缺点:满足不了复杂的需求)
packagecom.timer1;
importjava.util.Date;
importjava.util.TimerTask;
/**
*jdk自带的定时器不需要引入任何的jar
*@authorAdministrator
*/
publicclassJdkTimerTaskextendsTimerTask{
inta=1;
@Override
publicvoidrun(){
System.out.println("我的定时任务"+newDate()+""+a++);
}
}
测试类
packagecom.timer1;
importjava.util.Timer;
publicclassTestTimerTask{
publicstaticvoidmain(String[]args){
//新建一个timer
Timert=newTimer("定时任务");
//执行我们的定时任务第一个参数是定时任务对象0是立即开始3000每隔3秒钟执行一次
t.schedule(newJdkTimerTask(),0,3000);
}
}
第二种是基于Quartz的纯代码去实现的,需要下载Quartz的jar,而jar的版本不一样实现的方式又不一样
以下代码是基于quartz-all-1.6.1.jar版本和quartz-2.2.3-distribution(quartz-2.2.3、quartz-jobs-2.2.3)去实现两种方式的,两种只能选择一种。
packagecom.timer3;
importjava.util.Date;
importorg.quartz.Job;
importorg.quartz.JobExecutionContext;
importorg.quartz.JobExecutionException;
/**
*定时任务
*@authorAdministrator
*/
publicclassQuartzTimerimplementsJob{
inta=1;
@Override
publicvoidexecute(JobExecutionContextarg0)throwsJobExecutionException{
System.out.println("我的quartz定时任务"+newDate()+""+a++);
}
}
以下是测试方式(注:因为两种模式写在一起了所以jar包导入可能不对,需要以引用的jar的版本为准)
packagecom.timer3;
importjava.text.ParseException;
importjava.util.Date;
importorg.quartz.CronExpression;
importorg.quartz.CronTrigger;
importorg.quartz.JobDetail;
importorg.quartz.Scheduler;
importorg.quartz.SchedulerException;
importorg.quartz.SchedulerFactory;
importorg.quartz.SimpleTrigger;
importorg.quartz.Trigger;
importorg.quartz.impl.StdSchedulerFactory;
publicclassTestQuartzTimer{
publicstaticvoidmain(String[]args)throwsSchedulerException,ParseException{
/**
*jar版本quartz-all-1.6.1.jar
*/
//新建一个定时任务处理类jobDetail
//JobDetailjobDetail=newJobDetail("quartzTimer","quartzTimerGroup",QuartzTimer.class);
//创建定时器触发器
/*SimpleTriggersimpleTrigger=newSimpleTrigger("quartzTimerTrigger","quartzTimerTriggerGroup");
//什么时间点执行newDate()立即启动
simpleTrigger.setStartTime(newDate());
//执行多少次10次
simpleTrigger.setRepeatCount(10);
//每隔多少秒执行一次1000是代表1秒
simpleTrigger.setRepeatInterval(1000);*/
//表达式的触发器两个触发器只需要一个就好了。
/*CronTriggercronTrigger=newCronTrigger("quartzTimerCronTrigger","quartzTimerCronTriggerGroup");
//新建一个表达式
CronExpressioncronExpression=newCronExpression("0/532/10-23**?*");
//将表达式放入触发器
cronTrigger.setCronExpression(cronExpression);
//新建一个计划共工厂
StdSchedulerFactorystdSchedulerFactory=newStdSchedulerFactory();
//获取到一个计划任务
Schedulerscheduler=stdSchedulerFactory.getScheduler();
//将定时器任务处理类和触发器结合在一起
scheduler.scheduleJob(jobDetail,cronTrigger);
//启动触发器
scheduler.start();*/
//quartz2.X版本以上做法++++++++++++++++++++++++++++++++++++++++++++++++
/**
*quartz-2.2.3-distribution(quartz-2.2.3、quartz-jobs-2.2.3)
*/
//通过schedulerFactory获取一个调度器
/*SchedulerFactorysf=newStdSchedulerFactory();
Schedulersched=sf.getScheduler();
//创建jobDetail实例,绑定Job实现类
//指明job的名称,所在组的名称,以及绑定job类
JobDetailjob=JobBuilder.newJob(QuartzTimer.class).withIdentity("job1","group1").build();
//定义调度触发规则
//SimpleTrigger,从当前时间的下1秒开始,每隔1秒执行1次,重复执行2次
Triggertrigger=TriggerBuilder.newTrigger()
//指明trigger的name和group
.withIdentity("trigger1","group1")
//从当前时间的下1秒开始执行,默认为立即开始执行(.startNow())
.startAt(DateBuilder.evenSecondDate(newDate()))
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1)//每隔1秒执行1次
.withRepeatCount(2))//重复执行2次,一共执行3次
.build();
//corn表达式,先立即执行一次,然后每隔5秒执行1次
Triggertrigger=TriggerBuilder.newTrigger()
.withIdentity("trigger1","group1")
.withSchedule(CronScheduleBuilder.cronSchedule("*\/5****?"))
.build();
//把作业和触发器注册到任务调度中
sched.scheduleJob(job,trigger);
//启动计划程序(实际上直到调度器已经启动才会开始运行)
sched.start();
//等待10秒,使我们的job有机会执行
//Thread.sleep(10000);
//等待作业执行完成时才关闭调度器
//sched.shutdown(true);
*/
}
}
springMVC+Quartz配置文件的两种实现方式实现需要用(quartz-2.2.3-distribution(quartz-2.2.3、quartz-jobs-2.2.3)jar包
第一种需要继承QuartzJobBean
packagecom.timer4;
importjava.util.Date;
importorg.quartz.Job;
importorg.quartz.JobExecutionContext;
importorg.quartz.JobExecutionException;
importorg.quartz.SchedulerException;
importorg.quartz.spi.JobFactory;
importorg.quartz.spi.TriggerFiredBundle;
importorg.springframework.scheduling.quartz.QuartzJobBean;
/**
*定时任务
*@authorAdministrator
*/
publicclassQuartzTimerextendsQuartzJobBean{
@Override
protectedvoidexecuteInternal(JobExecutionContextarg0)throwsJobExecutionException{
System.out.println("我的Spring管理quartz定时任务"+newDate());
}
}
spring中的配置方式
<!--第一种-->
<!--任务调度处理类工厂-->
<beanid="jobDetail"class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<propertyname="jobClass"value="com.timer4.QuartzTimer"></property>
</bean>
<!--表达式触发器工厂-->
<beanid="cronTrigger"class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<propertyname="jobDetail"ref="jobDetail"></property>
<propertyname="cronExpression"value="0/513/10-23**?*"></property>
</bean>
<!--任务调度计划工厂-->
<beanid="scheduler"class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<propertyname="triggers">
<list>
<refbean="cronTrigger"/>
</list>
</property>
</bean>
第二种不需要继承任何类
packagecom.timer4;
importjava.util.Date;
publicclassQuartzTimer2{
protectedvoidexecute(){
System.out.println("我的Spring管理quartz定时任务2222"+newDate());
}
}
spring中配置方式
<!--第二种要调度的对象-->
<beanid="jobBean"class="com.timer4.QuartzTimer2"/>
<beanid="jobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<propertyname="targetObject"ref="jobBean"/>
<propertyname="targetMethod"value="execute"/>
<!--将并发设置为false-->
<propertyname="concurrent"value="false"/>
</bean>
<beanid="trigger"class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<propertyname="jobDetail"ref="jobDetail"/>
<!--表达式,我的是每5s执行一次-->
<propertyname="cronExpression"value="0/5****?"/>
</bean>
<!--总管理类如果将lazy-init='false'那么容器启动就会执行调度程序-->
<beanid="startQuertz"class="org.springframework.scheduling.quartz.SchedulerFactoryBean"lazy-init="false">
<propertyname="triggers">
<list>
<!--作业调度器,list下可加入其他的调度器-->
<refbean="trigger"/>
</list>
</property>
</bean>
Spring+SpringMVC+Quartzjar下载地址:http://pan.baidu.com/s/1nuHIUvv,密码:28ar
本文内容总结:
原文链接:https://www.cnblogs.com/Faith-zhang/p/7724634.html