Quartz是一个任务调度框架,由Java语言开发,能够用来作一些定时发送,监听事件等工做。
例如:让一个程序天天晚上12点执行一次。或者每隔5秒执行一次。spring
jar: org.quartz-scheduler包下app
Quartz完成调度须要3步框架
JobDetail:告诉调度器要作什么。 Trigger:告诉调度器何时作。 Scheduler:准备妥了就从这里start
下面就是一个简单的spring 整合quartz的实例。ide
先看JobDetail部分:写一个类实现Job接口,重写execute()方法,在该方法中写要执行的逻辑,(告诉调度器要作什么)网站
public class UpdateProductJob implements Job{ @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { try { System.out.print("我来检查啦") }catch (Exception e){ System.out.println(e); } } }
而后是配置xml文件。spa
<!--quartz--> <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.config.quartz.UpdateProductJob"></property> </bean> <!--执行时间表达方式一--> <!--<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">--> <!--<property name="jobDetail" ref="jobDetail"></property>--> <!--<property name="startDelay" value="10000"></property><!–延迟10s–>--> <!--<property name="repeatInterval" value="5000"></property>--> <!--</bean>--> <!--执行时间表达方式二--> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="jobDetail" /> <property name="cronExpression" value="0 59 23 ? * *" /> </bean> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean>
从上面能够看到有两个Trigger分别是simpleTrigger和cronTrigger,这是两种表达执行时间的方式。code
simpleTrigger是比较简单的方法, <property name="repeatInterval" value="5000"></property>表示间隔5秒执行一次 而cronTrigger能够表达一些比较复杂的时间格式 <property name="cronExpression" value="0 59 23 ? * *" />表示天天23点59分执行一次 具体的语法请搜索cron表达式,有些网站提供了自动生成cron表达式的功能 好比http://cron.qqe2.com/ or http://www.cronmaker.com/
在spring框架中会常常用到IOC,那么在上面的execute()方法中不避免的也会用到注入,可是对于新手来讲会遇到注入的接口会是null。
解决这个问题有两个方法:xml
1.使用ApplicationContex对象加载applicationContext.xml文件注入UserDaoI接口,可是这个方法很差的一点是每当用一个接口就要写一个,比较麻烦。对象
ApplicationContext content = new ClassPathXmlApplicationContext("classpath:META-INF/applicationContext.xml"); userDaoI = content.getBean(UserDaoI.class);
2.第二个方法比较好,先写一个类继承AdaptableJobFactory 抽象方法,不须要任何改动继承
@Service("jobFactory") public class JobFactory extends AdaptableJobFactory { @Autowired private AutowireCapableBeanFactory capableBeanFactory; @Override protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { // 调用父类的方法 Object jobInstance = super.createJobInstance(bundle); // 进行注入 capableBeanFactory.autowireBean(jobInstance); return jobInstance; } }
2.2而后将这个类添加到配置文件里。
<bean id="jobFactory" class="com.config.quartz.JobFactory"></bean> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="jobFactory" ref="jobFactory"></property> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean>
最后完整的配置信息是:
<!--quartz--> <bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.config.quartz.UpdateProductJob"></property> </bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="jobDetail" /> <property name="cronExpression" value="0 59 23 ? * *" /> </bean> <bean id="jobFactory" class="com.config.quartz.JobFactory"></bean> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="jobFactory" ref="jobFactory"></property> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean>
JobDetail部分就能够这样写了
@Service public class UpdateProductJob implements Job{ @Autowired ArticleService articleService; @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { try { articleService.updateArticleType(); }catch (Exception e){ System.out.println(e); } } }
Quartz轮训任务,须要配置一个参数,这个参数来控制Job任务是否并行,这个参数是concurrent。默认是true,若是concurrent设为true,到了指定的时间就如去执行,无论上一次有没有执行完。
<bean id="transmitTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject"> <ref bean="transTaskBusiness" /> </property> <property name="targetMethod"> <value>execute</value> </property> <property name="concurrent"> <value>false</value> </property> </bean>
TriggerListeners
and JobListeners
两个接口分别是触发器相关的监听接口和做业相关监听接口。
用来监听监听点
以前,之中,以后须要处理的事情。
此外,也能够直接继承JobListenerSupport
or TriggerListenerSupport
而且在配置文件添加如下内容来生效监听器:
<!--全局任务监听器 --> <bean id="scheduleJobListener" class="com.mashu.services.task.manager.ScheduleJobListener"> <property name="name" value="scheduleJobListener"></property> </bean>
除了能够配置全局的,也能够根据业务按个,按组配置监听器。
Quartz 2.3.0