可参考: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包。
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配置文件。
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类,不需要继承自任何基类。
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;
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 }
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',不懒加载,那么容器启动就会执行调度程序。
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>
效果如下所示:
待续......