博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring整合Quartz框架实现定时任务跑批(Maven完整版)
阅读量:5838 次
发布时间:2019-06-18

本文共 7918 字,大约阅读时间需要 26 分钟。

hot3.png

Quartz 介绍

Quartz is a full-featured, open source job scheduling service that can be integrated with, or
used along side virtually any Java application - from the smallest stand-alone application to
the largest e-commerce system. Quartz can be used to create simple or complex schedules for
executing tens, hundreds, or even tens-of-thousands of jobs;
Quartz框架是一个全功能、开源的任务调度服务,可以集成几乎任何的java应用程序—从小的单片机系统到大型
的电子商务系统。Quartz可以执行上千上万的任务调度。
Quartz核心的概念:scheduler任务调度、Job任务、Trigger触发器、JobDetail任务细节
Spring框架提供了对Quartz框架的支持,这对我们来说,方便了很多。我们还是通过Maven工程来演示。
 

1,pom.xml配置文件内容如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  3. <modelVersion>4.0.0</modelVersion>

  4.  
  5. <groupId>com.yangcq</groupId>

  6. <artifactId>SpringQuartzTest</artifactId>

  7. <version>1.0.0</version>

  8. <packaging>jar</packaging>

  9. <name>SpringQuartzTest</name>

  10.  
  11. <properties>

  12. <springframework.version>4.0.6.RELEASE</springframework.version><!-- Spring的版本 -->

  13. <quartz.version>2.2.1</quartz.version> <!-- Quartz的版本 -->

  14. </properties>

  15.  
  16. <dependencies>

  17. <dependency>

  18. <groupId>org.springframework</groupId>

  19. <artifactId>spring-core</artifactId>

  20. <version>${springframework.version}</version>

  21. </dependency>

  22. <dependency>

  23. <groupId>org.springframework</groupId>

  24. <artifactId>spring-context-support</artifactId>

  25. <version>${springframework.version}</version>

  26. </dependency>

  27. <!-- Spring事务的依赖 -->

  28. <dependency>

  29. <groupId>org.springframework</groupId>

  30. <artifactId>spring-tx</artifactId>

  31. <version>${springframework.version}</version>

  32. </dependency>

  33.  
  34. <!-- 定时任务框架Quartz的依赖-->

  35. <dependency>

  36. <groupId>org.quartz-scheduler</groupId>

  37. <artifactId>quartz</artifactId>

  38. <version>${quartz.version}</version>

  39. </dependency>

  40.  
  41. </dependencies>

  42. </project>

2,定义我们自己的Job实现类。
Spring框架整合Quartz时,不是直接继承Job类,而是继承QuartzJobBean,
我们这里的一个实现如下:

  1. package com.yangcq.quartz;

  2. import org.quartz.JobExecutionContext;

  3. import org.quartz.JobExecutionException;

  4. import org.springframework.scheduling.quartz.QuartzJobBean;

  5. /**

  6. *

  7. * yangcq

  8. * @description 由于Spring提供对Quartz的支持,所以直接使用Spring提供的API

  9. * @description 继承 org.springframework.scheduling.quartz.QuartzJobBean

  10. *

  11. */

  12. public class EBankJob extends QuartzJobBean {

  13. /**

  14. *

  15. */

  16. private EBankJobBean eBankJobBean;

  17.  
  18. protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {

  19. eBankJobBean.printAnotherMessage();

  20. }

  21.  
  22. public void setEBankJobBean(EBankJobBean eBankJobBean) {

  23. this.eBankJobBean = eBankJobBean;

  24. }

  25.  
  26. }

这部分代码就是一个典型的spring注入,实际上调用了eBankJobBean的方法。具体job的执行是在executeInternal
方法里。
问题一:目前这种方法没有测试通过,分析一下什么原因?
问题二:MethodInvokingJobDetailFactoryBean 与 JobDetailBean 的区别,研究Spring源码
答:
1,QuartzJobBean是Spring框架下的一个抽象类,这个类实现了Quartz的Job接口。我们可以理解为,Spring对Job的
进一步封装,
public abstract class QuartzJobBean implements Job
2,JobDetailBean也是继承了Quartz下面的JobDetail接口,这里为什么是继承,本人也感到费解,按说JobDetail是
一个抽象接口,
应该用implements关键字实现这个接口,具体代码如下:
public class JobDetailBean extends JobDetail
3,MethodInvokingJobDetailFactoryBean,这个类为我们设置定时任务,提供了丰富的支持,如下:

  1. private String name;

  2. private String group;

  3. private boolean concurrent;

  4. private String targetBeanName;

  5. private String[] jobListenerNames;

  6. private String beanName;

  7. private ClassLoader beanClassLoader;

  8. private BeanFactory beanFactory;

  9. private JobDetail jobDetail; 

 

 

  1. package com.yangcq.quartz;

  2. /**

  3. *

  4. * yangcq

  5. *

  6. */

  7. public class EBankJobBean {

  8. public void printAnotherMessage(){

  9. System.out.println("CronTriggerBean 调用的定时任务...");

  10. }

  11. }

因为是要将这些任务通过spring的配置文件来拼接到一起,我们来看看具体的配置文件该怎么设置。
在spring里,如果我们要执行一个计划任务,需要定义一个JobDetail,用它来封装我们具体执行的任务。结合前面纯quartz的示例,
我们发现它们其实本质上是一样的。这里的定义如下:
spring默认提供了一个叫MethodInvokingJobDetailFactoryBean,我们需要将定义好的对象和需要调用的方法传给它。
这里对应的是一种类型的jobDetail定义。对应的myBean定义如下:

 

  1. package com.yangcq.quartz;

  2. /**

  3. *

  4. * @author yangcq

  5. * @description SimpleTriggerFactoryBean 调用的定时任务

  6. */

  7. public class MyJobBean {

  8. public void printMessage() {

  9. System.out.println("SimpleTriggerFactoryBean 调用的定时任务...");

  10. }

  11. }

OK,下面写一个测试类,进行测试

  1. package com.yangcq.quartz;

  2.  
  3. import org.apache.commons.logging.Log;

  4. import org.apache.commons.logging.LogFactory;

  5. import org.springframework.context.ApplicationContext;

  6. import org.springframework.context.support.ClassPathXmlApplicationContext;

  7. /**

  8. *

  9. * @author yangcq

  10. * @description 启动定时任务main方法

  11. *

  12. */

  13. public class StartUpQuartzJobs {

  14.  
  15. static final Log log = LogFactory.getLog(StartUpQuartzJobs.class); // 日志

  16.  
  17. public static void main(String args[]) throws Exception {

  18. log.info("开始启动定时任务 ...");

  19. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

  20. log.info("定时任务启动成功...");

  21. }

  22. }

接下来就是关键部分了,Spring核心配置文件的的配置,配置文件applicationContext.xml配置如下:

 

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!-- Bean头部 -->

  3. <beans xmlns="http://www.springframework.org/schema/beans"

  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  5. xmlns:p="http://www.springframework.org/schema/p"

  6. xmlns:mvc="http://www.springframework.org/schema/mvc"

  7. xmlns:context="http://www.springframework.org/schema/context"

  8. xmlns:util="http://www.springframework.org/schema/util"

  9. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

  10. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd

  11. http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

  12.  
  13. <!-- 启动包扫描功能,以便注册带有@Controller、@Service、@repository、@Component等注解的类成为spring的bean -->

  14. <context:component-scan base-package="com.yangcq.quartz" />

  15.  
  16. <bean id="myJobBean" class="com.yangcq.quartz.MyJobBean"></bean>

  17. <bean id="eBankJobBean" class="com.yangcq.quartz.EBankJobBean"></bean>

  18.  
  19. <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

  20. <property name="targetObject" ref="myJobBean" />

  21. <property name="targetMethod" value="printMessage" />

  22. </bean>

  23. <!-- 这种封装的方式很简单,就是我定义了一个对象和它对应的方法。如果我们需要将它们封装成一个job了,只要把类的名字和 -->

  24. <!-- 对应的方法传进去就可以了。除了上述的JobDetail构造方式,还要一种更复杂一些,它的定义如下: -->

  25. <!-- 这里因为要用到一些对象的引用,对这些对象或者参数的传递可以通过jobDataMap来处理。 -->

  26. <bean name="complexJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

  27. <property name="targetObject" ref="eBankJobBean" />

  28. <property name="targetMethod" value="printAnotherMessage" />

  29. </bean>

  30.  
  31. <!-- Spring提供了2中触发器:SimpleTriggerBean 和 CronTriggerBean -->

  32.  
  33. <!-- Trigger触发器 :从第1秒开始,每3秒执行一次 -->

  34. <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">

  35. <property name="jobDetail" ref="simpleJobDetail" />

  36. <property name="startDelay" value="1000" />

  37. <property name="repeatInterval" value="3000" />

  38. </bean>

  39. <!-- Trigger触发器 :从第1秒开始,每5秒执行一次 -->

  40. <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">

  41. <property name="jobDetail" ref="complexJobDetail" />

  42. <property name="cronExpression" value="0/5 * * * * ?" />

  43. </bean>

  44.  
  45. <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

  46. <property name="jobDetails">

  47. <list>

  48. <ref bean="simpleJobDetail" />

  49. <ref bean="complexJobDetail" />

  50. </list>

  51. </property>

  52.  
  53. <property name="triggers">

  54. <list>

  55. <ref bean="simpleTrigger" />

  56. <ref bean="cronTrigger" />

  57. </list>

  58. </property>

  59. </bean>

  60. </beans>

 

 

  1. 启动程序以后,控制台输出如下:

  2. log4j:WARN No appenders could be found for logger (com.yangcq.quartz.StartUpQuartzJobs).

  3. log4j:WARN Please initialize the log4j system properly.

  4. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

  5. SimpleTriggerFactoryBean 调用的定时任务...

  6. CronTriggerBean 调用的定时任务...

  7. SimpleTriggerFactoryBean 调用的定时任务...

  8. CronTriggerBean 调用的定时任务...

  9. SimpleTriggerFactoryBean 调用的定时任务...

总结
在这两个示例里,我们首先通过一个纯手工的过程来完成一个任务调度的示例。它的主要步骤为
1.定义job
2. 定义trigger
3. 定义scheduler来拼接。
在后续使用spring的示例里,其实也是这么一个步骤,只不过spring提供了一些实现的支持,需要在配置文件里指定
不同的jobDetail类型和trigger类型。 --------------------- 本文来自 春秋战国程序猿 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/reggergdsg/article/details/52082487?utm_source=copy

转载于:https://my.oschina.net/u/3959491/blog/2223402

你可能感兴趣的文章
什么是关联分析?
查看>>
Vue.js 添加组件
查看>>
CNDS账号密码
查看>>
JS 判断当前使用浏览器名及版本
查看>>
C语言之函数调用17—递归法之中的一个般函数的调用(2)
查看>>
es6 模板字符串
查看>>
PyEcharts
查看>>
RecyclerView 缓存机制详解
查看>>
简单十招提高jQuery执行效率
查看>>
disruptor调研报告
查看>>
maven-surefire-plugin总结
查看>>
干货|BERT fine-tune 终极实践教程
查看>>
阿里开源项目最佳实践在线峰会免费报名!丨InfoQ读者福利
查看>>
「DTCC 2018」为云而生!解密华为 Cloud Native 分布式数据库
查看>>
“长安蔚来”落户南京:李斌任董事长 杨放任CEO
查看>>
蒙古族传统圣火祭祀点燃新年祈福之旅
查看>>
在湘留学生舞龙欢度中国农历小年:中国是第二个家
查看>>
新疆、内蒙、青海三省区骆驼齐聚柴达木上演“激情与速度”
查看>>
“咫尺之境——成都武侯祠馆藏扇面精品展”在成都开展
查看>>
python面试几大重点,BAT公司都很重视!
查看>>