Quartz 是一个开源的作业调度框架,设计用于 J2SE 和 J2EE 应用中。提供了巨大的灵活性而不牺牲简单性。能够用它来为执行一个作业而创建简单的或复杂的调度
Spring Quartz 是基于 Quartz 做的2次封装
Quartz分为2种调度器,简单调度和任务调度 ,核心就是3个bean
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean -- 定制任务类
org.springframework.scheduling.quartz.SimpleTriggerBean -- 简单触发器
org.springframework.scheduling.quartz.CronTriggerBean -- 任务触发器
org.springframework.scheduling.quartz.SchedulerFactoryBean --调度工厂
一、调度的步骤
1、制定任务信息 bean
设置执行对象
设置执行对象中对应的执行方法
是否可以同步执行
2、制定任务执行时机(执行触发器) bean
2.1、简单触发器或任务调度器(SimpleTrigger,CronTriggerBean)
设置任务详细(二者都需要)
设置任务延迟执行时间(任务调度器不需要配置)
设置任务执行频率(任务调度器不需要配置)
设置任务执行时机,cron表达式(任务调度器必须用)
2.2、任务触发器(CronTrigger)
设置任务详细
设置执行时机(cronExpression)
cronExpression:秒 分 时 日 月 周 年(可选)
3、设置任务调度工厂 bean
设置触发器们(可能是一个或多个触发器)
二、调度器demo
1、简单触发器
第一步先定义一个普通类,新增需要执行的方法
import java.text.SimpleDateFormat; import java.util.Date; //简单触发器、打印出来当前时间 public class QuartzTask { public void doSimpleTriggerTask() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("doing simpleTrigger task..." + sdf.format(new Date())); } }
第二步编写spring配置文件
<!-- 注册一个普通bean -->
<bean id="quartzTask" class="cn.terry.nsfw.complain.QuartzTask"></bean>
<!-- 1、制定任务信息信息 -->
<bean id="jobDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 设置执行对象 -->
<property name="targetObject" ref="quartzTask"></property>
<!-- 设置执行对象中对应的执行方法 -->
<property name="targetMethod" value="doSimpleTriggerTask"></property>
<!-- 是否可以同步执行;不可同步执行 -->
<property name="concurrent" value="false"></property>
</bean>
<!-- 2、制定任务执行时机(执行简单触发器) -->
<bean id="simplerTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<!-- 设置任务详细 -->
<property name="jobDetail" ref="jobDetail1"></property>
<!-- 设置任务延迟执行时间 ;延迟2秒执行-->
<property name="startDelay" value="2000"></property>
<!-- 设置任务执行频率;执行频率为每2秒执行一下 -->
<property name="repeatInterval" value="2000"></property>
</bean>
<!-- 3、设置调度工厂 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simplerTrigger"/>
</list>
</property>
</bean>
至此启动spring 2秒以后就会每2秒自动输出当前的时间
2、任务触发器
第一步先定义普通类,新增需要执行的方法
import java.text.SimpleDateFormat; import java.util.Date; //任务触发器、打印出来当前时间 public class QuartzTask { public void doCronTriggerTask() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("doing cronTrigger task..." + sdf.format(new Date())); } }
第二步编写spring配置文件
<!-- 注册一个普通bean -->
<bean id="quartzTask" class="cn.terry.nsfw.complain.QuartzTask"></bean>
<!-- 1、制定任务信息信息 -->
<bean id="jobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 设置执行对象 -->
<property name="targetObject" ref="quartzTask"></property>
<!-- 设置执行对象中对应的执行方法 -->
<property name="targetMethod" value="doCronTriggerTask"></property>
<!-- 是否可以同步执行;不可同步执行 -->
<property name="concurrent" value="false"></property>
</bean>
<!-- 2、制定任务执行时机(任务执行触发器) -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<!-- 设置任务详细 -->
<property name="jobDetail" ref="jobDetail2"></property>
<!-- 设置任务执行时机,cron表达式 -->
<property name="cronExpression" value="* * * 18c * ?"></property>
</bean>
<!-- 3、设置调度工厂 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
至此启动spring 2秒以后就会每2秒自动输出当前的时间
Tips:任务触发器常用,简单触发器没啥用
关于cronExpression表达式,这里简单说一下:
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /
表达式意义
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
每天早上6点
0 6 * * *
每两个小时
0 */2 * * *
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * *
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3
1月1日早上4点
0 4 1 1 *
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于