Quartz任务调度说明 CronTrigger + Spring

合集下载

quartz任务调度原理

quartz任务调度原理

Quartz任务调度原理解析1. 什么是Quartz任务调度Quartz是一个开源的、功能强大的作业调度库,可以用于创建基于时间表的作业调度。

它允许开发人员能够编写灵活和可靠的作业,并将其安排在特定的时间或间隔内执行。

Quartz提供了丰富的API和灵活的配置选项,使得任务调度变得简单易用。

2. Quartz任务调度原理Quartz任务调度的基本原理可以分为以下几个方面:2.1 Job和Trigger在Quartz中,Job代表一个要执行的具体任务,而Trigger则定义了这个任务何时被执行。

Trigger可以基于时间表达式(cron表达式)来定义执行时间,也可以根据一些特定的规则来触发执行。

2.2 调度器(Scheduler)Scheduler是Quartz任务调度器的核心组件,负责管理所有Job和Trigger,并根据配置进行作业调度。

Scheduler可以创建、暂停、恢复和删除Job以及相关联的Trigger。

它还负责记录所有Job的状态信息,并在需要时触发相关事件。

2.3 JobDetailJobDetail是定义一个特定Job实例的详细信息,包括Job类名、Job名称、所属组等属性。

每个JobDetail都关联一个唯一标识符(JobKey),用于在Scheduler中唯一标识该Job。

2.4 TriggerTrigger是定义一个作业何时执行的组件。

它可以基于时间表达式来定义执行时间,也可以根据一些特定的规则来触发执行。

每个Trigger都关联一个唯一标识符(TriggerKey),用于在Scheduler中唯一标识该Trigger。

2.5 JobExecutionContextJobExecutionContext是Job在执行时的上下文信息,包括当前执行时间、上次执行时间、下次执行时间等。

Job可以通过获取JobExecutionContext中的信息来进行任务处理。

2.6 JobFactoryJobFactory负责创建Job实例,当Scheduler需要调度一个Job时,会通过JobFactory创建一个新的实例,并将其交给Scheduler管理。

quartz的cron表达式

quartz的cron表达式

quartz的cron表达式Quartz的Cron表达式简介1. 什么是Cron表达式Cron表达式是一种用于定时任务调度的标准格式。

在Quartz框架中,Cron表达式被广泛使用,用于设置任务的执行时间。

2. Cron表达式的语法Cron表达式由6个或7个字段组成,每个字段代表时间的一个维度。

这6个或7个字段分别是:•秒(0~59)•分钟(0~59)•小时(0~23)•日(1~31)•月(1~12)•周几(0~7,0和7都代表周日)可以使用通配符或范围来表示时间的不确定性。

例如,“*“代表所有可能的值,”?“在日和周几字段中代表不指定值,”-“用来表示范围,” / “用来表示递增间隔。

例如,要设置每天早上9点执行任务,Cron表达式可以是0 0 9 ? * *。

3. 常用的Cron表达式示例以下是一些常见的Cron表达式示例:•0 0/5 * * * ?表示每隔5分钟执行一次任务。

•0 0 12 * * ?表示每天中午12点执行任务。

•0 0 8 ? * MON-FRI表示周一到周五每天早上8点执行任务。

•0 0 8 ? * 6L表示每个月的最后一个周五早上8点执行任务。

4. Cron表达式的高级用法Cron表达式还支持一些高级功能,例如使用”#“指定月份中的第几个周几,使用”L”指定月份中的最后一天,使用”W”指定平日最近的工作日等等。

以下是一些高级用法的示例:•0 0 12 ? JAN,FEB,DEC *表示一月、二月和十二月每天中午12点执行任务。

•0 0/30 9-17 * * MON-FRI#2表示周一到周五上午9点到下午5点之间,每隔30分钟执行一次任务,并且每个月的第二个周一符合条件。

5. 总结Cron表达式是Quartz框架中用于指定任务执行时间的标准格式。

它非常灵活,并且支持多种时间维度的设置。

掌握Cron表达式的语法和常用示例,可以帮助我们轻松实现定时任务的调度。

6. Cron表达式的注意事项在使用Cron表达式时,需要注意以下几点:•时间表达式字段之间使用空格分隔。

调度Quartz时间格式配置

调度Quartz时间格式配置

调度Quartz时间格式配置1、 CronTrigger时间格式配置说明CronTrigger配置格式:格式: [秒] [分] [⼩时] [⽇] [⽉] [周] [年]通配符说明:* :表⽰所有值. 例如:在分的字段上设置 "*",表⽰每⼀分钟都会触发。

:表⽰不指定值。

使⽤的场景为不需要关⼼当前设置这个字段的值。

例如:要在每⽉的10号触发⼀个操作,但不关⼼是周⼏,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?- :表⽰区间。

例如在⼩时上设置 "10-12",表⽰ 10,11,12点都会触发。

, :表⽰指定多个值,例如在周字段上设置 "MON,WED,FRI" 表⽰周⼀,周三和周五触发/ :⽤于递增触发。

如在秒上⾯设置"5/15" 表⽰从5秒开始,每增15秒触发(5,20,35,50)。

在⽉字段上设置'1/3'所⽰每⽉1号开始,每隔三天触发⼀次。

L :表⽰最后的意思。

在⽇字段设置上,表⽰当⽉的最后⼀天(依据当前⽉份,如果是⼆⽉还会依据是否是润年[leap]), 在周字段上表⽰星期六,相当于"7"或"SAT"。

如果在"L"前加上数字,则表⽰该数据的最后⼀个。

例如在周字段上设置"6L"这样的格式,则表⽰“本⽉最后⼀个星期五"W :表⽰离指定⽇期的最近那个⼯作⽇(周⼀⾄周五). 例如在⽇字段上设置"15W",表⽰离每⽉15号最近的那个⼯作⽇触发。

如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周⼀(16号)触发.如果15号正好在⼯作⽇(周⼀⾄周五),则就在该天触发。

如果指定格式为 "1W",它则表⽰每⽉1号往后最近的⼯作⽇触发。

Quartz——CronTrigger触发器

Quartz——CronTrigger触发器

转载请出自出处:一.概述CronTrigger 能够提供比 SimpleTrigger 更有具体实际意义的调度方案,调度规则基于 Cron 表达式,CronTrigger 支持日历相关的重复时间间隔(比如每月第一个周一执行),而不是简单的周期时间间隔。

二.Cron表达式介绍1)Cron表达式规则表Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成,各个字段的含义如下表所示:字段位置位置含义允许值允许的特殊字符1 秒0-59 , - * /2 分钟0-59 , - * /3 小时0-23 , - * /4 日期1-31 , - * ? / L W C5 月份1-12 , - * /6 星期1-7 , - * ? / L C #7 年(可选) 空值;1970-2099 , - * /2)Cron表达式中的特殊字符Cron表达式的各个字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,具体规则如下所示:星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符;减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。

如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y;L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。

L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。

quartz用法

quartz用法

Quartz用法一、什么是Quartz?Quartz是一个功能强大且广泛应用于Java中的开源任务调度框架。

它允许开发人员通过简单而灵活的方式在应用程序中调度和执行任务。

无论是简单的定时任务还是复杂的作业调度,Quartz都可以满足需求。

二、Quartz的基本概念在深入探讨Quartz的用法之前,我们首先需要了解一些基本概念。

1. 作业(Job)作业是Quartz中最基本的调度单元。

它表示一项任务或一个操作,可以被Quartz 调度和执行。

2. 触发器(Trigger)触发器是Quartz中用于指定作业何时执行的组件。

可以根据时间表达式(如每小时、每天等)来触发作业的执行,也可以根据特定的日期和时间来触发。

3. 调度器(Scheduler)调度器是Quartz的核心组件,它负责在指定的时间触发作业的执行。

调度器可以同时管理多个作业和触发器,并根据设定的调度策略来决定执行顺序。

三、Quartz的用法接下来,我们将深入探讨Quartz的用法,包括作业和触发器的创建、调度器的配置和管理。

1. 创建作业要创建一个作业,我们需要定义一个类,实现Quartz的Job接口,并重写其中的execute()方法。

在execute()方法中,我们可以编写具体的任务逻辑。

例如:public class MyJob implements Job {public void execute(JobExecutionContext context) throws JobExecutionExcept ion {// 编写具体的任务逻辑}}2. 创建触发器Quartz提供了多种触发器类型,可以根据需求灵活选择。

其中最常用的是SimpleTrigger和CronTrigger。

•SimpleTrigger:简单触发器会在指定的时间间隔内循环执行作业。

可以设置作业的开始时间、结束时间和重复次数。

•CronTrigger:基于Cron表达式触发器允许我们非常灵活地指定作业的执行时间。

Spring集成Quartz定时任务框架介绍和Cron表达式详解

Spring集成Quartz定时任务框架介绍和Cron表达式详解

在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等。

我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但时调度控制非常不方便,并且我们需要大量的代码。

使用Quartz框架无疑是非常好的选择,并且与Spring可以非常方便的集成,下面介绍它们集成方法和Cron表达式的详细介绍。

一、增加所依赖的JAR包1、增加Spring的Maven依赖<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>3.0.5.RELEASE</version></dependency>2、增加Quartz的Maven依赖<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>1.8.4</version></dependency>二、增加定时业务逻辑类publicclass ExpireJobTask {/** Logger */privatestaticfinal Logger logger =LoggerFactory.getLogger(ExpireJobTask.class);/*** 业务逻辑处理*/publicvoid doBiz() {// 执行业务逻辑// ........}}ExpireJobTask业务逻辑类与一般普通的类没有任务区别,它定义的doBiz方法即为调度业务方法。

Quartz(计划任务)2.x 使用简介

Quartz(计划任务)2.x 使用简介

Quartz 计划任务使用简介Quartz是个开源项目,可以用于JAVAEE,SE项目中,提供强大的计划任务机制。

版本历史:1.0至1.5,Quartz属于OpenSymphony开源组织。

1.7至目前版本2.x 更换组织名为,其官方网站是: 本文以2.2.1版本为例,演示基本使用方法。

方式一:在Java项目中单独使用(main方法调用).方式二:在Java web + spring环境整合使用.开发环境:JDK1.6, maven3.x, spring3.2.2, quartz2.2.1对于初学者,需要先明白quartz项目的概念。

为了将计划任务高度抽象,quartz将所有计划任务都提取出2个部分:作业(即定义需要程序做什么),触发器(即定义什么时候做)。

将这两部分解耦和之后,可以提高两部分的复用性。

比如:一个作业,可以在多个触发器下运作;同时,一个触发器,也可以用于多个作业。

准备工作步骤如下:1.从下载Quartz zip文件。

2.解压缩并把quartz-x.x.x.jar 放在项目文件夹内,或者把文件放在项目的类路径中。

3.把core 和/或optional 文件夹中的jar 文件放在项目的文件夹或项目的类路径中。

代码演示:方式一:在Java项目中单独使用(main方法调用).步骤1:先建立一个作业(Job)自己写一个类,实现org.quartz.Job接口,并实现execute()方法,使得当前类可被执行。

代码截图:步骤2:写一个单元测试类,代码如下:以上代码演示了:作业+调度器=计划任务其中调度器部分,使用了quartz实现的Cron调度器,关于Cron表达式的使用,请参考wiki:/wiki/Cron本文演示的cron表达式效果是:每隔3秒钟运行一次。

方式二:在Java web + spring环境整合使用.Spring框架同样提供了对Quartz整合的支持,需要将文件添加到项目构建路径。

C#调用Quartz定时任务。使用Cron表达式的方法

C#调用Quartz定时任务。使用Cron表达式的方法

C#调⽤Quartz定时任务。

使⽤Cron表达式的⽅法最近在做⼀个定时任务,要求是每⼀分钟触发⼀次。

由于之前是采⽤的FluentScheduler写的,现在改成了Cron表达式。

中间出现了⼀些问题,所以现在写下来,和⼤家分享⼀下。

先说⼀下准备⼯作,你需要这么三个dll:将他们添加到指定的位置就可以了。

定时任务,我们要做的就是在⼀开始运⾏项⽬的时候让他启动,所以在Global.asax⾥⾯的这个⽅法⾥⾯增加圈出的这个⽅法,指向你另⼀个类中的⽅法。

我是指向了这么⼀个类PlanRegistry,这⾥⾯的这个Start⽅法:public static void Start(){string QuestionCron = ConfigurationManager.AppSettings["quarterCon"] == null ? "0 0/1 * * * ? *" : ConfigurationManager.AppSettings["quarterCon"];////新建⼀个调度器⼯⼯⼚ISchedulerFactory factory = new StdSchedulerFactory();////使⽤⼯⼚⽣成⼀个调度器IScheduler scheduler = factory.GetScheduler();//启动调度器scheduler.Start();IJobDetail job = JobBuilder.Create<CreateCheckTaskJob>().Build();// 新建⼀个触发器ITrigger trigger = TriggerBuilder.Create().StartNow().WithCronSchedule(QuestionCron).Build();//将任务与触发器关联起来放到调度器中scheduler.ScheduleJob(job, trigger);}这个地⽅有⼀个点需要注意,那就是这个quarterCon,我们需要从我们的Web.Config配置⽂件中读取。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

触发器中两个重要的触发器1,SimpleTrigger :可以精确到毫秒,如果需要让任务只在某个时刻执行一次,或者,在某个时刻开始,然后按照某个时间间隔重复执行例如:public SimpleTrigger(String name, //名称String group, //组名Date startTime, //开始时间Date endTime, //结束时间(控制权高于重复次数属性)为null时直到永远int repeatCount, //重复次数(可能是0)long repeatInterval) //重复间隔(以毫秒为单位)2,CronTrigger :像日历那样按日程来触发任务。

可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。

也可以像SimpleTrigger一样,CronTrigger也有一个startTime以指定日程从什么时候开始,也有一个(可选的)endTime以指定何时日程不再继续.Cron表达式被用来配置CronTrigger实例.Cron表达式是一个由7个子表达式组成的字符串。

每个子表达式都描述了一个单独的日程细节。

这些子表达式用空格分隔,分别表示:秒分钟小时月中的天天周中的天年秒---例如:3/5从第3秒开始每隔5秒触发一次通配符('*')可以被用来表示域中“每个”可能的值'?'字符可以用在day-of-month及day-of-week域中,它用来表示“没有指定值”。

'L'字符可以在day-of-month及day-of-week中使用,L是last的缩写。

如时在day-of-month 中L表示的月的最后一天。

在day-of-week中,表示"当月的最后的周XXX",例如:"6L" 或者"FRIL"都表示本月的最后一个周五。

'#'表示表示月中的第几个周几。

例如:day-of-week 域中的"6#3" 或者"FRI#3"表示“月中第三个周五”。

注意:对于单独触发器来说,有些日程需求可能过于复杂而不能用表达式表述,例如:9:00到10:00之间每隔5分钟触发一次,下午1:00到10点每隔20分钟触发一次。

这个解决方案就是创建两个触发器,两个触发器都运行相同的任务。

CronTrigger 例1 –一个简单的每隔5分钟触发一次的表达式"0 0/5 * * * ?"CronTrigger 例2 –在每分钟的10秒后每隔5分钟触发一次的表达式(例如. 10:00:10 am, 10:05:10等.)。

"10 0/5 * * * ?"CronTrigger 例3 –在每个周三和周五的10:30,11:30,12:30触发的表达式。

"0 30 10-13 ? * WED,FRI"CronTrigger 例4 –在每个月的5号,20号的8点和10点之间每隔半个小时触发一次且不包括10点,只是8:30,9:00和9:30的表达式。

"0 0/30 8-9 5,20 * ?"注意,对于单独触发器来说,有些日程需求可能过于复杂而不能用表达式表述,例如:9:00到10:00之间每隔5分钟触发一次,下午1:00到10点每隔20分钟触发一次。

这个解决方案就是创建两个触发器,两个触发器都运行相同的任务。

CronTrigger +Spring比如每天晚上11点30分30秒对系统数据进行备份。

1,要写一个job类package .fbi.ln.quartz;public class SayFBI {@AutowiredFeedBackRuleService feedBackRuleService;//可以注入service 层public void validCalculateFee() throws Exception {//调用service层的方法对系统数据进行备份}}2,注入job类<bean id="sayFBI" class=".fbi.ln.quartz.SayFBI"></bean>3,注入任务类及方法。

<bean id="jobtask4" class="org.springframework.scheduling.quartz.MethodInvokingJobDet ailFactoryBean"><property name="targetObject"><ref bean="sayFBI"/><!--job的实体类--></property><property name="targetMethod"><value>validCalculateFee</value><!--job中的方法--></property></bean>4,在spring中配置时间触发器<bean id="doTime4" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail"><!--设置触发时执行的任务--><ref bean="jobtask4"/></property><property name="cronExpression"><value>30 30 11 * * ?</value><!--每天晚上11点30分30秒--></property></bean><bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean ">5,注入要启动的触发器到总管理类<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean "><property name="triggers"><list><ref bean="doTime4"/><ref bean="doTime5"/><ref bean="doTime6"/></list></property></bean>6,实例化总管理类,启动监听final Scheduler s = (Scheduler) SpringContextHelper.getContext().getBean("startQuertz");s.start();//通过这个方法就可以启动监听了以上配置的文明:1,先写一个job类sayFBI,sayFBI里面有方法validCalculateFee。

2,注入任务类及方法。

3,注入触发器,并将任务类和时间设置进行注入。

4,最后注入总管理类,当总管理类实例化时执行start()方法启动触发器SimpleTrigger +Spring1,<!-- 定义调用对象和调用对象的方法 --><bean id="job"class="org.springframework.scheduling.quartz.JobDetailBean"><property name="jobClass"><value> com.learnworld.quartz.MessageJob </value></property><property name="jobDataAsMap"><map><entry key="message"><value>This is a message from Spring Quartz configuration!</value></entry></map></property></bean>2, <!-- 定义触发时间 --><bean id="trigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="startDelay"><value>1000</value></property><property name="repeatInterval"><value>3000</value></property><property name="jobDetail"><ref local="job" /></property></bean>3,<!-- 总管理类如果将lazy-init='false'那么容器启动就会执行调度程序 --> <bean id="schdulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean "><property name="triggers"><list><ref local="trigger" /></list></property></bean></beans>1,为什么触发器没有被触发?最常见的原因就是没有调用Scheduler.start(),这个方法告知scheduler开始触发触发器。

相关文档
最新文档