引言
像这样的比较常用的技术,肯定是被我们spring这个大神进行整合过的,因为这些东西一旦和sprig 整合之后,我们自己编写的代码就比较少了,提高了开发效率,下面看整合的过程。
引入依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.0.6.RELEASE</version> </dependency>
这个包的作用是什么呢?这个jar 文件包含支持UI模版(Velocity,FreeMarker,JasperReports),邮件服务,脚本服务(JRuby),缓存Cache(EHCache),任务计划Scheduling(uartz)方面的类。
外部依赖spring-context, (spring-jdbc, Velocity, FreeMarker, JasperReports, BSH, Groovy, JRuby, Quartz, EHCache
编写Job代码
package cn.itcast.quartz; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.quartz.QuartzJobBean; /** * * */ public class MyJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("myJob 执行了............." + context.getTrigger().getKey().getName()); ApplicationContext applicationContext = (ApplicationContext) context.getJobDetail().getJobDataMap() .get("applicationContext"); System.out.println("获取到的Spring容器是: " + applicationContext); } }
和入门程序对比,这个job中的代码显然少了很多,其中我们需要关注的一点就是,我们继承了一个QuartzJobBean,这个是spring 给我提供的包中的一个类,我们只需要重写里面的一个executeInternal即可。
spirng配置文件的编写
<!-- 定义任务bean --> <bean name="myJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- 指定具体的job类 --> <property name="jobClass" value="cn.itcast.quartz.MyJob" /> <!-- 指定job的名称 --> <property name="name" value="myJob" /> <!-- 指定job的分组 --> <property name="group" value="jobs" /> <!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中删除该任务 --> <property name="durability" value="true"/> <!-- 指定spring容器的key,如果不设定在job中的jobmap中是获取不到spring容器的 --> <property name="applicationContextJobDataKey" value="applicationContext"/> </bean> <!-- 定义触发器 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="myJobDetail" /> <!-- 每一分钟执行一次 --> <property name="cronExpression" value="0/5 * * * * ?" /> </bean> <!-- 定义触发器 --> <!-- 演示:一个job可以有多个trigger; --> <!-- <bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="myJobDetail" /> 每一分钟执行一次 <property name="cronExpression" value="0 */1 * * * ?" /> </bean> --> <!-- 定义调度器 --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger" /> <!-- <ref bean="cronTrigger2" /> --> </list> </property> </bean>
入口类编写
package cn.itcast.quartz; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { //初始化spring容器 public static void main(String[] args) { new ClassPathXmlApplicationContext("classpath:applicationContext-scheduler.xml"); } }
这个时候只要我们启动spring容器后,定时任务就是按照我们编写的频率和job自动执行。
当我们和spring进行整合以后,我们的开发变得非常的简单,但是这里有两个问题:
一个job能否多个trigger? 可以在上面代码中我们已经进行了测试,同时将一个job添加到多个trigger中是没有问题的,代码如上。
一个trigger能否多个job? 不可以
小结
定时任务在在实际项目中用的还是非常多的,并且在互联网项目中这中需求更是常见,所以我们需要掌握类似Quartz,elastic-job这样的任务调度的框架的开发!
下面博客将介绍电商项目中,如何用Quartz解决超时订单问题!