前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring集成Quartz框架的两种方式。

Spring集成Quartz框架的两种方式。

作者头像
别先生
发布2019-09-29 11:12:16
3900
发布2019-09-29 11:12:16
举报
文章被收录于专栏:别先生别先生

可参考:https://blog.csdn.net/yk614294861/article/details/84324603

1、使用Spring与Quarta配置作业得两种方式:   a、方式一,MethodInvokingJobDetailFactoryBean。作业类即普通的java类,不需要继承自任何基类。   b、方式二,JobDetailFactoryBean。作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean。

2、创建一个maven项目,web工程的。引入pom.xml包。

代码语言:javascript
复制
 1 <project xmlns="http://maven.apache.org/POM/4.0.0"
 2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <groupId>com.bie</groupId>
 6     <artifactId>springQuartz</artifactId>
 7     <packaging>war</packaging>
 8     <version>0.0.1-SNAPSHOT</version>
 9     <name>springQuartz Maven Webapp</name>
10     <url>http://maven.apache.org</url>
11 
12     <properties>
13         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
14         <spring.version>4.3.6.RELEASE</spring.version>
15     </properties>
16     <dependencies>
17         <dependency>
18             <groupId>junit</groupId>
19             <artifactId>junit</artifactId>
20             <version>3.8.1</version>
21             <scope>test</scope>
22         </dependency>
23         <dependency>
24             <groupId>org.springframework</groupId>
25             <artifactId>spring-webmvc</artifactId>
26             <version>${spring.version}</version>
27         </dependency>
28         <dependency>
29             <groupId>org.springframework</groupId>
30             <artifactId>spring-context</artifactId>
31             <version>${spring.version}</version>
32         </dependency>
33 
34         <dependency>
35             <groupId>org.springframework</groupId>
36             <artifactId>spring-aop</artifactId>
37             <version>${spring.version}</version>
38         </dependency>
39 
40         <dependency>
41             <groupId>org.springframework</groupId>
42             <artifactId>spring-core</artifactId>
43             <version>${spring.version}</version>
44         </dependency>
45 
46         <dependency>
47             <groupId>org.springframework</groupId>
48             <artifactId>spring-context-support</artifactId>
49             <version>${spring.version}</version>
50         </dependency>
51 
52         <dependency>
53             <groupId>org.springframework</groupId>
54             <artifactId>spring-tx</artifactId>
55             <version>${spring.version}</version>
56         </dependency>
57         <dependency>
58             <groupId>org.quartz-scheduler</groupId>
59             <artifactId>quartz</artifactId>
60             <version>2.2.3</version>
61         </dependency>
62     </dependencies>
63     <build>
64         <finalName>springquartz</finalName>
65         <plugins>
66             <plugin>
67                 <groupId>org.apache.maven.plugins</groupId>
68                 <artifactId>maven-compiler-plugin</artifactId>
69                 <configuration>
70                     <source>1.8</source>
71                     <target>1.8</target>
72                 </configuration>
73             </plugin>
74         </plugins>
75     </build>
76 
77 </project>

然后配置一下你的web.xml配置文件。

代码语言:javascript
复制
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 4     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
 5     http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 6     id="WebApp_ID" version="3.1">
 7     <display-name>springQuartz</display-name>
 8     <welcome-file-list>
 9         <welcome-file>index.html</welcome-file>
10         <welcome-file>index.jsp</welcome-file>
11     </welcome-file-list>
12 
13     <!-- spring MVC的核心就是DispatcherServlet,使用springMVC的第一步就是将下面的servlet放入web.xml 
14         servlet-name属性非常重要,默认情况下,DispatchServlet会加载这个名字-servlet.xml的文件, 如下,就会加载 dispather-servlet.xml,也是在WEN-INF目录下。 -->
15     <servlet>
16         <!-- 配置DispatcherServlet -->
17         <servlet-name>springMvc</servlet-name>
18         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
19         <!-- 指定spring mvc配置文件位置 不指定使用默认情况 -->
20         <init-param>
21             <param-name>contextConfigLocation</param-name>
22             <param-value>classpath:/spring-mvc.xml</param-value>
23         </init-param>
24         <!-- 设置启动顺序 -->
25         <load-on-startup>1</load-on-startup>
26     </servlet>
27     <!-- ServLet 匹配映射 -->
28     <!-- 设置dispatchservlet的匹配模式,通过把dispatchservlet映射到/,默认servlet会处理所有的请求,包括静态资源 -->
29     <servlet-mapping>
30         <servlet-name>springMvc</servlet-name>
31         <url-pattern>/</url-pattern>
32     </servlet-mapping>
33 
34 
35 
36 
37 </web-app>

3、使用第一种方式。方式一,MethodInvokingJobDetailFactoryBean。作业类即普通的java类,不需要继承自任何基类。

代码语言:javascript
复制
 1 package com.bie.quartz;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 
 6 import org.springframework.stereotype.Component;
 7 
 8 @Component("myBean")
 9 public class MyBean {
10     
11     /**
12      * 
13      */
14     public void printMessage() {
15         System.out.println("==============================第1种方式开始=========================\n\n\n");
16         // 打印当前的执行时间,格式为2017-01-01 00:00:00
17         Date date = new Date();
18         SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
19         System.out.println("第1种方式:我的bean 执行了呢!" + sf.format(date) + "\n\n\n");
20         System.out.println("==============================第1种方式开始=========================\n\n\n");
21 
22     }
23 }

4、使用第二种方式,方式二,JobDetailFactoryBean。作业类需要继承自特定的作业类基类,

如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;

代码语言:javascript
复制
 1 package com.bie.quartz;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 
 6 import org.quartz.JobExecutionContext;
 7 import org.quartz.JobExecutionException;
 8 import org.springframework.scheduling.quartz.QuartzJobBean;
 9 
10 public class FirstScheduledJob extends QuartzJobBean {
11 
12     private AnotherBean anotherBean;
13 
14     public void setAnotherBean(AnotherBean anotherBean) {
15         this.anotherBean = anotherBean;
16     }
17 
18     @Override
19     protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
20         System.out.println("==============================第2种方式开始=========================\n\n\n");
21         Date date = new Date();
22         SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
23         System.out.println("第2种方式:我的调度作业 执行了呢!" + sf.format(date) + "\n\n\n");
24         this.anotherBean.printAnotherMessage();
25     }
26 }
代码语言:javascript
复制
 1 package com.bie.quartz;
 2 
 3 import org.springframework.stereotype.Component;
 4 
 5 @Component("anotherBean")
 6 public class AnotherBean {
 7 
 8     public void printAnotherMessage() {
 9         System.out.println("第2种方式: 自己注入的bean被调用了......\n\n\n");
10         System.out.println("==============================第2种方式:结束=========================\n\n\n");
11     }
12 
13 }

然后配置一下你的配置文件。就可以启动了。需要注意的是如果全局default-lazy-init="true",懒加载,需要调用才会进行调度的。如果将lazy-init='false',不懒加载,那么容器启动就会执行调度程序。

代码语言:javascript
复制
  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <beans xmlns="http://www.springframework.org/schema/beans"
  3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4     xmlns:context="http://www.springframework.org/schema/context"
  5     xmlns:mvc="http://www.springframework.org/schema/mvc"
  6     xmlns:p="http://www.springframework.org/schema/p"
  7     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  8             http://www.springframework.org/schema/beans/spring-beans.xsd  
  9             http://www.springframework.org/schema/mvc  
 10             http://www.springframework.org/schema/mvc/spring-mvc.xsd  
 11             http://www.springframework.org/schema/context  
 12             http://www.springframework.org/schema/context/spring-context.xsd">
 13 
 14     <!-- 通过mvc:resources设置静态资源,这样servlet就会处理这些静态资源,而不通过控制器 -->
 15     <!-- 设置不过滤内容,比如:css,jquery,img 等资源文件 -->
 16     <mvc:resources location="/*.html" mapping="/**.html" />
 17     <mvc:resources location="/css/*" mapping="/css/**" />
 18     <mvc:resources location="/js/*" mapping="/js/**" />
 19     <mvc:resources location="/images/*" mapping="/images/**" />
 20     <!-- 设定消息转换的编码为utf-8防止controller返回中文乱码 -->
 21     <bean
 22         class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
 23         <property name="messageConverters">
 24             <list>
 25                 <bean
 26                     class="org.springframework.http.converter.StringHttpMessageConverter">
 27                     <property name="supportedMediaTypes">
 28                         <list>
 29                             <value>text/html;charset=UTF-8</value>
 30                         </list>
 31                     </property>
 32                 </bean>
 33             </list>
 34         </property>
 35     </bean>
 36     <!-- 添加注解驱动 -->
 37     <mvc:annotation-driven />
 38     <!-- 默认扫描的包路径 -->
 39     <context:component-scan base-package="com.bie" />
 40 
 41     <!-- mvc:view-controller可以在不需要Controller处理request的情况,转向到设置的View -->
 42     <!-- 像下面这样设置,如果请求为/,则不通过controller,而直接解析为/index.jsp -->
 43     <mvc:view-controller path="/" view-name="index" />
 44     <bean
 45         class="org.springframework.web.servlet.view.UrlBasedViewResolver">
 46         <property name="viewClass"
 47             value="org.springframework.web.servlet.view.JstlView"></property>
 48         <!-- 配置jsp路径前缀 -->
 49         <property name="prefix" value="/"></property>
 50         <!-- 配置URl后缀 -->
 51         <property name="suffix" value=".jsp"></property>
 52     </bean>
 53 
 54     <!-- ====================================================================================================== -->
 55 
 56     <!-- 第一种方式 -->
 57     <!--第一步 要执行任务的作业类。 -->
 58     <!-- 由于这里采用了注解方式,所以下面得ref直接使用自己注入容器得bean即可。 -->
 59 
 60     <!-- 第二步 将需要执行的定时任务注入JOB中。JobDetail是将定时任务进行组合。 -->
 61     <bean id="simpleJobDetail"
 62         class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
 63         <!-- 任务类中需要执行的目标类 -->
 64         <property name="targetObject" ref="myBean" />
 65         <!-- 任务类中需要执行的方法 -->
 66         <property name="targetMethod" value="printMessage" />
 67         <!-- 上一次未执行完成的,要等待有再执行。 -->
 68         <property name="concurrent" value="false"></property>
 69     </bean>
 70 
 71     <!-- 距离当前时间1秒之后执行,之后每隔两秒钟执行一次 -->
 72     <bean id="mySimpleTrigger"
 73         class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
 74         <!-- 引用上面得ref="simpleJobDetail" -->
 75         <property name="jobDetail" ref="simpleJobDetail" />
 76         <!-- 距离当前时间1秒之后执行 -->
 77         <property name="startDelay" value="1000" />
 78         <!-- 之后每隔两秒钟执行一次 -->
 79         <property name="repeatInterval" value="2000" />
 80     </bean>
 81 
 82     <!-- 第四步 配置调度工厂 -->
 83     <bean
 84         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
 85         <property name="triggers">
 86             <list>
 87                 <!-- 简单定时任务触发器 -->
 88                 <ref bean="mySimpleTrigger" />
 89             </list>
 90         </property>
 91         <property name="jobDetails">
 92             <list>
 93                 <!-- 引用作业详情 -->
 94                 <ref bean="simpleJobDetail" />
 95             </list>
 96         </property>
 97     </bean>
 98 
 99 
100     <!-- ====================================================================================================== -->
101 
102 
103     <!-- 第二种方式 -->
104     <!--第一步:1.将自定义的job类(已经继承QuartzJobBean) 注入JobDetailFactoryBean -->
105     <bean id="firstComplexJobDetail"
106         class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
107         <property name="jobClass"
108             value="com.bie.quartz.FirstScheduledJob" />
109         <property name="jobDataMap">
110             <map>
111                 <!-- 注入其他bean引用 -->
112                 <entry key="anotherBean" value-ref="anotherBean" />
113             </map>
114         </property>
115         <property name="durability" value="true" />
116     </bean>
117 
118 
119     <!-- 每隔5秒钟执行一次 -->
120     <!--第二步:2. 定义触发器,并且将jobDetail注入 -->
121     <bean id="myCronTrigger"
122         class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
123         <property name="jobDetail" ref="firstComplexJobDetail" />
124         <!-- 每隔5秒钟执行一次 -->
125         <property name="cronExpression" value="0/5 * * ? * *" />
126     </bean>
127 
128     <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
129     <!-- 全局default-lazy-init="true"需要调用才会进行调度的。 -->
130     <!-- 第三步:配置调度工厂 -->
131     <bean lazy-init="false"
132         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
133         <property name="triggers">
134             <list>
135                 <ref bean="myCronTrigger" />
136             </list>
137         </property>
138         <property name="jobDetails">
139             <list>
140                 <ref bean="firstComplexJobDetail" />
141             </list>
142         </property>
143     </bean>
144 
145 
146 </beans>  

效果如下所示:

待续......

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档