spring项目中使用quartz定时执行任务

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zhouhaisunny/article/details/88784959

项目需求:

1.有一个定时表task其中包括文章id和文章发布时间,状态三个字段,每隔1分钟读取一次该表将未发布并且发布时间小于当前时间的文章发布出去。这样就需要定时执行某个方法实现。

2.每天固定的时间点执行某个方法。

使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂,本文是前文分类中的第二种方式:https://blog.csdn.net/zhouhaisunny/article/details/54669918

spring能够支持quartz作业类不继承特定基类这种方式,归功于两个类:

org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean

org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

实例:

 pom.xml

<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>com.citywy</groupId>
  <artifactId>SpringTimer</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
 
  <properties>
	  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	  <maven.compiler.source>1.7</maven.compiler.source>
	  <maven.compiler.target>1.7</maven.compiler.target>
	  <!-- spring版本号 -->
	  <spring.version>4.2.5.RELEASE</spring.version>
  </properties>
 
  <dependencies>
    <!-- 添加jstl依赖 -->
       <dependency>
           <groupId>jstl</groupId>
           <artifactId>jstl</artifactId>
           <version>1.2</version>
       </dependency>
       <dependency>
           <groupId>javax</groupId>
           <artifactId>javaee-api</artifactId>
           <version>7.0</version>
       </dependency>
       
       <!-- 添加spring核心依赖 -->
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-core</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-oxm</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-jdbc</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-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-aop</artifactId>
           <version>${spring.version}</version>
       </dependency>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-test</artifactId>
           <version>${spring.version}</version>
       </dependency>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-jms</artifactId>
           <version>${spring.version}</version>
       </dependency>
       
        <!-- quartz定时任务 ,20190325最新包-->
		<dependency>
		    <groupId>org.quartz-scheduler</groupId>
		    <artifactId>quartz</artifactId>
		    <version>2.3.0</version>
		</dependency>
  </dependencies>
 
  <build>
  		<finalName>springtimer</finalName>
  </build>
</project>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <display-name>springtimer</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>
</web-app>

springmvc.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:mvc="http://www.springframework.org/schema/mvc"  
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd   
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd ">
		<!-- 自动扫描包下面的文件,类上带有@Controller的会注册为bean -->
		<context:component-scan base-package="com.citywy.controller"/>
		<!-- 代替处理器映射器、处理器适配器 ,mvc注解驱动-->
		<mvc:annotation-driven/>
		<!-- 定义跳转的文件的前后缀 ,视图模式配置 -->
		<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
			<property name="prefix" value="/"/>
			<property name="suffix" value=".jsp"/>
		</bean>
	    <import resource="classpath:applicationContext-task.xml"/>
</beans>

applicationContext-task.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:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
		http://www.springframework.org/schema/task
		http://www.springframework.org/schema/task/spring-task-3.0.xsd">
	<bean id="myTask" class="com.citywy.util.MyTask">
	</bean>
	<!-- 一、配置作业类 -->
	<bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="myTask"/><!-- targetObject指定任务类 -->
		<property name="targetMethod" value="task"/><!-- targetMethod指定运行的方法 -->
		<property name="concurrent" value="false" /><!-- 作业不并发调度,了解如果前一条未执行结束同时过来会如何 --> 
    </bean>
    <!-- 二、配置作业调度的触发方式(触发器) 两种方式:-->
    <!-- 第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。 -->
    <!-- <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
		<property name="jobDetail" ref="methodInvokingJobDetail" />
		<property name="startDelay" value="0" />			*调度工厂实例化后,经过0秒开始执行调度   
		<property name="repeatInterval" value="2000" />		*每2秒调度一次  
	</bean>-->
	<!-- 第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等。 
	**注意**:在quartz 1.8.6及以前版本的时候 调度触发器 依赖的类是 org.springframework.scheduling.quartz.CronTriggerBean
	在2.xx版本之后就改为了org.springframework.scheduling.quartz.CronTriggerFactoryBean-->
	<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    	<property name="jobDetail" ref="methodInvokingJobDetail"/>
    	<property name="cronExpression" value="0/5 * * * * ?"/><!-- 这里是每五秒执行一次 -->
	</bean>
	<!-- 三、配置调度工厂 -->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref local="cronTrigger" /><!-- 该参数指定的就是之前配置的触发器的名字。 -->
			</list>
		</property>
	</bean>
</beans>

cronExpression即cron表达式自行百度,设定你的定时规则。 

MyTask.java

package com.citywy.util;

import java.text.SimpleDateFormat;
import java.util.Date;

public class MyTask {
	public void task() throws InterruptedException{
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		System.out.println("任务调度类"+sdf.format(new Date()));
		//下面代码用来验证定时配置中<property name="concurrent" value="false" />这个配置起到的作用
		//案例:每隔5秒读取某表中的定时发布数据,如果有很多文章需要定时发布,那么第一个定时任务还在执行,第二个定时任务也来执行了,就会导致文章重复发布的问题!
		//结论:concurrent配置为false后,如果上一个定时任务还没执行完,下一个定时任务到达时会进入等待,一旦第一个执行完,下一个立刻执行,不会出现文章重复发布的情况。
//		Thread.sleep(8000);//休眠8秒
//		System.out.println("sleep结束:"+sdf.format(new Date()));
	}
}

不注释console:

任务调度类2019-03-24 11:49:40
sleep结束:2019-03-24 11:49:48
任务调度类2019-03-24 11:49:48
sleep结束:2019-03-24 11:49:56
任务调度类2019-03-24 11:49:56
sleep结束:2019-03-24 11:50:04
任务调度类2019-03-24 11:50:04

注释console:

任务调度类2019-03-24 11:50:40
任务调度类2019-03-24 11:50:45
任务调度类2019-03-24 11:50:50
任务调度类2019-03-24 11:50:55

下面这个类没用,就是测试项目搭的对不对-.-

TestController.java

package com.citywy.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class TestController {
	@RequestMapping("show")
	public ModelAndView show(HttpServletRequest request,HttpServletResponse response){
		ModelAndView res = new ModelAndView("index");
		System.out.println("come in");
		res.addObject("name","tarui瑞");
		return res;
	}
	
}

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%  
String path = request.getContextPath();  
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.6.4.min.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>hello word</title>
</head>
 
<body> 
	<div>
		<h2>${name}</h2>
	</div>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/zhouhaisunny/article/details/88784959