您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 关于定时器的各种方法及说明
定时器准备JAR包:quartz-all-1.6.5.jar(重要)xercesimpl.jar(解析定时器配置文件用)commons-digester-1.8.jarcommons-beanutils-1.7.0.jarcommons-dbcp-1.2.2.jarcommons-modeler-2.0.jarcommons-pool-1.3.jar一、前言Quartz太强大了,配置的方式也多种多样,实现的效果也多种多样,值得研究。定时器分为WEB和非WEB两种。定时器分为简单和复杂两种。区别在于:简单的只支持间隔固定的时间,做某些事情。时间可以通过自己随便写的配置文件读取。复杂的支持每周、每月、从哪天到哪天,或者更复杂的配置。配置文件可以放在SPRING,或者独立出来单独写,配置比较复杂。二、一些名词解释作业(JobDetail)就是你定时任务具体要做什么事情的实现类,实现类方法一般为实现了org.quartz.Job接口的具体类,入口为execute(),执行中有异常抛org.quartz.JobExecutionException。可以配给多个Trigger。触发器(Trigger)用来设置定时任务的什么时间执行。分为简单(SimpleTrigger)和复杂(CronTrigger)两种。简单只能设置从什么时候开始,间隔时间为多久;复杂可以设置复杂的时间。只能对应一个JobDetail。筛选日历(Calendar)用来屏蔽一段时间区域。可以用org.quartz.CronTrigger,也可以自己创建Calender,需要extendsBaseCalendar。监听器(Listener)用来监听定时任务。分为监听Job的,监听Trigger的,和监听Scheduler的,监听File。监听Job和监听Trigger又分为全局或非全局监听器。全局可以监听所有的Job/Trigger;非全局只能监听已注册了监听器的Job或Triiger的事件。调度器(Schduler)用来注册jobDetail、注册trigger、注册calendar、注册Listener。然后可以启动、暂停、停止定时任务。如果有多个jobDetail,就要注册多个。三、创建定时器步骤1、创建Scheduler的实例。可以通过两个Scheduler工厂创建实例。1)org.quartz.impl.DirectoSchedulerFactoryDirectSchedulerFactoryfactory=DirectSchedulerFactory.getInstance();factory.create***(***);Schedulerscheduler=factory.getScheduler();可以选择不同的create***(***)方法设置你要的配置属性。2)org.quartz.impl.StdSchedulerFactoryStdSchedulerFactoryfactory=newStdSchedulerFactory();Propertiesprops=newProperties();props.put(StdSchedulerFactory.PROP_THREAD_POOL_CLASS,org.quartz.simpl.SimpleThreadPool);props.put(org.quartz.threadPool.threadCount,10);factory.initialize(props);Schedulerscheduler=factory.getScheduler();通过java.util.Properties实例来提供属性。StdSchedulerFactoryfactory=newStdSchedulerFactory();factory.initialize(mytask.properties);Schedulerscheduler=factory.getScheduler();通过外部属性文件提供属性。(Properties下面有介绍)System.setProperty(org.quartz.properties,mytask.properties);StdSchedulerFactoryfactory=newStdSchedulerFactory();Schedulerscheduler=factory.getScheduler();通过重新设置默认属性资源文件mytask.properties。StdSchedulerFactoryfactory=newStdSchedulerFactory();Schedulerscheduler=factory.getScheduler();不提供属性,默认用Jar包中的quartz.propertiesSchedulerscheduler=StdSchedulerFactory.getDefaultScheduler();通过静态方法,更简单,默认用Jar包中的quartz.properties2、创建JobDetail,实现定时任务需要做的事情。任何Java做的事情都可以成为一个Job。publicclassTaskForOperateimplementsJob{publicvoidexecute(JobExecutionContextcontext)throwsJobExecutionException{System.out.println(这里写你想做的事情。);......}}实现org.quartz.Job接口,方法execute()会被调用。JobDetailjobDetail=newJobDetail(TaskForOperate,Scheduler.DEFAULT_GROUP,TaskForOperate.class);创建JobDetail构造器,Job的名称,逻辑组名,和实现org.quartz.Job接口的全限类名称3、创建Trigger,实现定时间任务时间的设置。Triggertrigger=TriggerUtils.makeSecondlyTrigger(20);trigger.setName(myTrigger);trigger.setStartTime(newDate());创建简单触发器每20秒钟触发一次的,从现在开始(立刻开始)Triggertrigger=newSimpleTrigger(myTrigger,Scheduler.DEFAULT_GROUP,newDate(),null,-1,10000);创建简单触发器每10秒钟触发一次的,从现在开始(立刻开始),执行无限次CronTriggertrigger=newCronTrigger(CronTrigger,null,0/5****?);创建复杂触发器每5秒钟触发一次的。NthIncludedDayTriggertrigger=newNthIncludedDayTrigger(myTrigger,Scheduler.DEFAULT_GROUP);trigger.setN(15);创建复杂触发器每个月的15号触发一次的。4、抠掉不需要执行定时任务的特别时间,其它时间需要执行。(此步骤可选)AnnualCalendarcal=newAnnualCalendar();CalendargCal=GregorianCalendar.getInstance();gCal.set(Calendar.MONTH,Calendar.JULY);gCal.set(Calendar.DATE,4);cal.setDayExcluded(gCal,true);scheduler.addCalendar(bankHolidays,cal,true,true);除7月4号之外,你都可以看到定时任务会执行。5、创建Listener,实现监听定时任务执行前或执行后,做什么事情。publicclassSimpleJobListenerimplementsJobListener{//返回Job监听器的名字publicStringgetName(){returngetClass().getSimpleName();}publicvoidjobToBeExecuted(JobExecutionContextcontext){//Scheduler在JobDetail将要被执行时调用这个方法}publicvoidjobExecutionVetoed(JobExecutionContextcontext){//Scheduler在JobDetail即将被执行,但又被TriggerListener否决了时调用这个方法}publicvoidjobWasExecuted(JobExecutionContextcontext,JobExecutionExceptionjobException){//Scheduler在JobDetail被执行之后调用这个方法}}创建一个Job的监听器。publicclassSimpleTriggerListenerimplementsTriggerListener{/***获取Trigger监听器的名字*@returnString监听器的名字*/publicStringgetName(){returngetClass().getSimpleName();}publicvoidtriggerComplete(Triggerarg0,JobExecutionContextarg1,intarg2){//Trigger被触发并且完成了Job的执行时}publicvoidtriggerFired(Triggerarg0,JobExecutionContextarg1){//Scheduler在Trigger被触发,Job将要被执行时调用这个方法}publicvoidtriggerMisfired(Triggerarg0){//Scheduler在Trigger错过触发时候,调用这个方法}publicbooleanvetoJobExecution(Triggerarg0,JobExecutionContextarg1){//Scheduler在Trigger触发后,Job将要被执行时调用这个方法//返回true表示Job此次触发不会执行returnfalse;}}创建一个Trigger的监听器publicclassSimpleSchedulerListenerimplementsSchedulerListener{publicvoidjobScheduled(Triggerarg0){//在JobDetail部署时调用}publicvoidjobUnscheduled(Stringarg0,Stringarg1){//在JobDetail卸载时调用}publicvoidjobsPaused(Stringarg0,Stringarg1){//一个或一组JobDetail暂停时调用这个方法}publicvoidjobsResumed(Stringarg0,Stringarg1){//一个或一组Job从暂停上恢复时调用这个方法}publicvoidschedulerError(Stringarg0,SchedulerExceptionarg1){//正常运行期间产生一个严重错误时调用这个方法}publicvoidschedulerShutdown(){//用来通知Scheduler将要被关闭调用该方法}publicvoidtriggerFinalized(Triggerarg0){//当一个Trigger来到了再也不会触发的状态时调用这个方法}publicvoidtriggersPaused(Stringarg0,Stringarg1){//Trigger或Trigger组被暂停时调用这个方法}publicvoidtriggersResumed(Stringarg0,Stringarg1){/
本文标题:关于定时器的各种方法及说明
链接地址:https://www.777doc.com/doc-3705226 .html