闲来无事,写了点东西,话不多说先记录下来。防止以后需要用到。
首先我们要知道任务调度器(定时器)有几种,这边我会写三种
第一种是基于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