Scheduler
StdSchedulerFactory
配置参数一般存储在 quartz.properties
主要函数
// 将job和trigger注册到scheduler Date scheduleJob(JobDetail jobDetail, Trigger trigger) // 启动 void start() // 暂停 void standby() // 关闭 // true 等待所有任务执行完成再关闭 // false 直接关闭 void shutdown()
quartz.properties
文档位置和加载顺序
jar 包下有默认配置
组成部分
- 调度器属性
- 线程池属性
- 作业存储位置
- 插件配置
SpringMVC 整合 Quartz
新建 maven webapp
依赖
webmvc
context
aop
core
配置 Quartz 的两种方式:
- MethodInvokingJobDetailFactoryBean 适合调用特定 bean 方法时很方便
- JobDetailFactoryBean 支持传入一些参数
项目结构
$ tree -I target . ├── pom.xml ├── src │ └── main │ ├── java │ │ └── com │ │ └── mouday │ │ ├── controller │ │ │ └── IndexController.java │ │ └── quartz │ │ ├── ComplexJob.java │ │ └── SimpleJob.java │ ├── resources │ │ └── dispatcher-servlet.xml │ └── webapp │ ├── WEB-INF │ │ └── web.xml │ └── index.jsp
1、pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>spring-mvc-demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring.version>5.2.6.RELEASE</spring.version> </properties> <build> <finalName>springquartz</finalName> <plugins> <!-- tomcat7插件 maven 命令 tomcat7:run 启动项目--> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8080</port> <path>/</path> <uriEncoding>UTF-8</uriEncoding> <!--添加忽略war包检查标签,则可以让tomcat7:run指令正常启动tomcat--> <ignorePackaging>true</ignorePackaging> <contextFile>src/main/webapp/WEB-INF/web.xml</contextFile> <contextReloadable>true</contextReloadable> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- 需要 context-support tx 的支持--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> <scope>compile</scope> </dependency> </dependencies> </project>
2、src/main/webapp/index.jsp
<html> <body> <h2>Hello World!</h2> </body> </html>
3、src/main/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="utf-8" ?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 配置分发器 默认加载配置文件:名字-servlet.xml --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定配置文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:dispatcher-servlet.xml</param-value> </init-param> <!-- 表示容器再启动时立即加载servlet --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <!-- 处理所有URL --> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
4、src/main/resources/dispatcher-servlet.xml
<?xml version="1.0" encoding="utf-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd "> <!--防止中文乱码--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html; charset=utf-8</value> </list> </property> </bean> </list> </property> </bean> <!-- 添加注解驱动--> <mvc:annotation-driven/> <!-- 默认扫描包路径--> <context:component-scan base-package="com.mouday"/> <!-- view-controller 可以直接不通过controller处理request,转发到view--> <mvc:view-controller path="/" view-name="index"/> <!-- 渲染器--> <bean id="jspViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <!-- 结果视图的前缀--> <property name="prefix" value="/"/> <!-- 结果视图的后缀--> <property name="suffix" value=".jsp"/> </bean> <!--配置Quartz--> <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="simpleJob"/> <property name="targetMethod" value="sayHello"/> </bean> <bean id="complexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <property name="jobClass" value="com.mouday.quartz.ComplexJob"/> <property name="jobDataMap"> <map> <entry key="name" value="Tom"/> </map> </property> <property name="Durability" value="true"/> </bean> <!--一s之后执行,每隔2s执行一次--> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <property name="jobDetail" ref="simpleJobDetail"/> <property name="startDelay" value="1000"/> <property name="repeatInterval" value="2000"/> </bean> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="complexJobDetail"/> <property name="cronExpression" value="0/3 * * * * ? *"/> </bean> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="jobDetails"> <list> <ref bean="simpleJobDetail"/> <ref bean="complexJobDetail"/> </list> </property> <property name="triggers"> <list> <ref bean="simpleTrigger"/> <ref bean="cronTrigger"/> </list> </property> </bean> </beans>
5、src/main/java/com/mouday/controller/IndexController.java
package com.mouday.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; /** * 仅用于SpringMVC服务测试 */ @Controller public class IndexController { @GetMapping("/login") @ResponseBody public String login( @RequestParam(value = "name", required = false) String name, @RequestParam(value = "password", required = false) String password ) { return "name:" + name + " password:" + password; } }
6、src/main/java/com/mouday/quartz/SimpleJob.java
package com.mouday.quartz; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; @Component("simpleJob") public class SimpleJob { public void sayHello(){ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("SimpleJob "+ dateFormat.format(new Date()) ); } }
7、src/main/java/com/mouday/quartz/ComplexJob.java
package com.mouday.quartz; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; import java.text.SimpleDateFormat; import java.util.Date; public class ComplexJob extends QuartzJobBean { private String name; public void setName(String name) { this.name = name; } protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("ComplexJob name: " + this.name + " " + dateFormat.format(new Date())); } }
总结
- Timer 优缺点
- Quartz 三大要素
- Quartz&Spring 融合