可参考: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种方式开始========================= "); 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) + " "); 20 System.out.println("==============================第1种方式开始========================= "); 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种方式开始========================= "); 21 Date date = new Date(); 22 SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 23 System.out.println("第2种方式:我的调度作业 执行了呢!" + sf.format(date) + " "); 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被调用了...... "); 10 System.out.println("==============================第2种方式:结束========================= "); 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>
效果如下所示:
待续......