例如在开发购物网站时会遇到一个问题,因白天订单多流量大,为减轻网站压力要求一些不是太急的任务(如给注册用户发送广告邮件、清理平常垃圾信息等)放在凌晨流量较小时间段去执行,这个时候就须要使用到任务调度,指定在某个时间内执行某个任务java
Quartz调度器为调度工做提供更丰富的支持,与Java定时器同样,可以使用Quartz指定每隔多少毫秒执行一个工做,但Quartz比Java的Timer优点在于Quartz容许调度一个工做在某个特定的时间或日期执行。web
QuartzJobBean实现org.quartz.Job接口。QuartzJobBean子类应当覆盖executeInternal()方法,在executeInternal()方法中定义预约的时刻应执行动做(这一步是指明作什么)spring
参考代码以下:CustomerQuartzJobBean.javaapp
package www.enfp.cc.springquartz; import java.util.Date; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class CustomerQuartzJobBean extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { //指定须要执行的任务,这里仅仅是输出当前时间 System.out.println("执行调度任务: (当前时间:" + new Date() + ")"); } }
1.配置执行工做<作什么>ide
JobDetailBean是Quartz的JobDetail的子类,经过jobClass属性来设置一个Job对象,将第一步的QuartzJobBean的子类的全路径传给JobDetailBean的jobClass属性测试
参考代码以下:网站
<!-- 配置执行工做(作什么) --> <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"> <value>www.enfp.cc.springquartz.CustomerQuartzJobBean</value> </property> </bean>
2.触发器Trigger的配置(配置执行时间和执行哪一个工做)<什么时间作什么>spa
Quartz的Trigger类描述了调度时机和频度,Spring提供了两个触发器:SimpleTriggerBean、CronTriggerBean。code
(1).使用SimpleTriggerBean调度器(属性)介绍xml
参考代码以下:
<!-- 执行效果:启动任务6秒后执行任务,而且每一个4秒执行一次 --> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <!-- 指定任务(作什么) --> <property name="jobDetail"> <ref bean="jobDetail" /> </property> <!-- 服务启动后延迟多少时间执行,单位毫秒 --> <property name="startDelay" value="6000"></property> <!-- 重复执行任务的时间间隔,单位毫秒 --> <property name="repeatInterval" value="4000"></property> </bean>
(2).使用CronTriggerBean调度器(属性)介绍
一个cron表达式有至少6个(也多是7个)由空格分隔的时间元素。从左至右,这些元素的定义以下
注意: 每个元素均可显式规定一个值(如6),一个区间(如9-12),一个列表(如9,11,13)或一个通配符(如*)。“月份中的日期”和“星期中的日期”互斥,应经过设置一个问号(?)来代表你不想设置的那个字段
参考代码以下:
<!-- (触发器的配置)配置执行时间(或间隔)和执行哪一个工做(什么时间作什么) --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <!-- (作哪一个工做) --> <property name="jobDetail" ref="jobDetail"></property> <!-- 配置cron表达式(什么时间作) --> <property name="cronExpression" value="0 * 11 * * ?"></property> </bean>
(3).启动触发器
使用Spring的SchedulerFactoryBean类可以使用list表示启动多个触发器
参考代码以下:
<!-- 启动触发器 --> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <!-- 能够启动多个触发器,因此采用list标签 --> <list> <ref bean="cronTrigger"/> </list> </property> </bean>
1.web应用中使用(在web.xml文件加载beans.xml)
2.在java 应用中使用ClassPathXmlApplicationContext类加载beans.xml
参考代码以下:SpringQuartzTest.java
package www.enfp.cc.springquartz; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringQuartzTest { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "beans.xml"); } }
补充:
常见一些cron表达式的例子: