Quartz简介 Quartz是OpenSymphony开源组织在Jobscheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java。util。Timer。但是相较于Timer,Quartz增加了很多功能: 持久性作业就是保持调度定时的状态; 作业管理对调度作业进行有效的管理;Quartz运行环境。Quartz可以运行嵌入在另一个独立运行的程序中。Quartz可以在应用程序服务器(或servlet容器中)被实例化,并且参与事务。Quartz可以作为一个独立的应用程序运行。可以通过RMI使用。Quartz可以被实例化,作为独立的项目集群,用于任务执行。Quartz的设计模式。Builder模式Factory模式,工厂模式组件模式链式模式Quartz的核心概念 1。任务job Job就是你想要实现的任务类。每一个Job必须实现的org。quartz。job接口。且需实现接口的Execute()方法。 2。触发器Trigger Trigger为你执行任务的触发器,比如你想每天定时8点钟去打卡,Trigger就会设置在8点钟去执行该任务。 Trigger主要有2种触发器器,分别为SimpleTrigger,CornTrigger两种。 3。调度器Scheduler Scheduler为任务调度器,它将任务Job和触发器Trigger整合起来。负责基于Trigger设定的时间来执行job。Quartz的体系结构 开启一个Quartz项目 1。依赖dependencygroupIdorg。quartzschedulergroupIdquartzartifactIddependency 2。编写jobpackagecom。keelon。quz。demo。importorg。quartz。Jimportorg。quartz。JobExecutionCimportorg。quartz。JobExecutionEimportjava。text。SimpleDateFimportjava。util。DpublicclassMyJobimplementsJob{Overridepublicvoidexecute(JobExecutionContextjobExecutionContext)throwsJobExecutionException{输出当前的时间的任务DatedatenewDate();SimpleDateFormatformatternewSimpleDateFormat(yyyymmddHH:MM:SS);StringdateStrformatter。format(date);System。out。println(正在进行数据库备份时间是:dateStr);}} 3。调用。packagecom。keelon。quz。demo。importorg。quartz。;importorg。quartz。impl。StdSchedulerFpublicclassTestJob{publicstaticvoidmain(String〔〕args)throwsSchedulerException{SchedulerscheduledStdSchedulerFactory。getDefaultScheduler();JobDetailjobDetailbJobBuilder。newJob(MyJob。class)。withIdentity(job1,group1)。build();TriggertriggerTriggerBuilder。newTrigger()。withIdentity(trigger1,group1)。startNow()。withSchedule(SimpleScheduleBuilder。simpleSchedule()。withIntervalInSeconds(5)。repeatForever())。build();scheduled。scheduleJob(jobDetailb,trigger);scheduled。start();}}JobExecutionContext JobExecutionContext是一个包含了各种上下文信息的句柄,指向执行中的JobDetail实例和执行完成的Trigger实例 当Schedule调用一个Job时,就会将JobExecutionContext传递给Job的exceute()方法。 Job能够通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的数据明细。我可以通过这个context来访问Trigger,Jobs相关的信息。JobKeyjobKeyjobExecutionContext。getJobDetail()。getKey();log。info(工作任务的名称,jobKey。getName());TriggerKeytriggerKeyjobExecutionContext。getRecoveringTriggerKey();log。info(工作任务的工作组的名称,jobKey。getName());JobDataMap介绍 1。使用Map获取 在进行任务调度时,JobDataMap存储在JobExecutionContext中非常方便的进行获取。 jobDataMap可以装载任何可序列化的对象。当job实例对象被执行的时候,这些参数会传递给Job 放入参数SchedulerscheduledStdSchedulerFactory。getDefaultScheduler();JobDetailjobDetailbJobBuilder。newJob(MyJob。class)。withIdentity(job1,group1)。usingJobData(message,jobs)。build();TriggertriggerTriggerBuilder。newTrigger()。withIdentity(trigger1,group1)。startNow()。withSchedule(SimpleScheduleBuilder。simpleSchedule()。withIntervalInSeconds(5))。usingJobData(message,这是trigger)。build();scheduled。scheduleJob(jobDetailb,trigger);scheduled。start(); 取出参数StringmsgjobExecutionContext。getJobDetail()。getJobDataMap()。getString(message);Job有状态和无状态 Job中有一个StatefulJob子接口,代表着有状态的任务,该接口是一个没有方法的标签接口,其目的就是让Quartz知道任务的类型,以便采用不同的执行方案。DisallowConcurrentExecution不允许并发执行,即JOB为串行执行。PersistJobDataAfterExecution在执行后将JobData持久化。 无状态任务在执行时,拥有自己的JobDataMap拷贝,每次执行时,都会创建一个新的实例,对JobData的更改不会影响下次的执行。而有状态任务共享同一个JobDataMap实例,每次任务执行对JobDataMap所做的更改都会保存下来,后面的执行可以看到这个更改。也就是每次执行任务后都会对后面的执行发生影响。 正因为这个原因,无状态的Job可以并发执行,而有状态的StatefulJob不能并发执行。CronTrigger触发器 如果你需要像日历一样,按照日程来触发任务,而不是像SimpleTrigger那样每隔定时间来触发,CornTrigger更加的实用。因为他是基于日历的作业调度器。 使用CronTrigger,你可以指定每个周五中午,或者每个工作日的十点钟。或者每周一,像这样的日程安排触发。 1。CronExpressionCron表达式 Cron表达式是来配置,CronTrigger实例。Cron表达式是有7个子表达式组成的字符串,每个表达式都描述了一个单独的日程细节。这些表达式用空格来分割。分别表示如下 1。Second秒 2。Minutes分钟 3。Hours小时 4DayofMonth月中的每天 5Month月 6DayofWeek周中某天 7Year年 例如下面写一个每个9月19号,每5秒执行一次。DatestartDatenewDate();startDate。setTime(startDate。getTime()5000);DateendDatenewDate();endDate。setTime(endDate。getTime()10000);SchedulerscheduledStdSchedulerFactory。getDefaultScheduler();JobDetailjobDetailbJobBuilder。newJob(JobTrigger。class)。withIdentity(job1,group1)。build();TriggertriggerTriggerBuilder。newTrigger()。withIdentity(trigger1,group1)。startAt(startDate)。endAt(endDate)。withSchedule(CronScheduleBuilder。cronSchedule(05199?))。build();scheduled。scheduleJob(jobDetailb,trigger);scheduled。start();