项目需求:
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
4.0.0
com.citywy
SpringTimer
0.0.1-SNAPSHOT
war
UTF-8
1.7
1.7
4.2.5.RELEASE
jstl
jstl
1.2
javax
javaee-api
7.0
org.springframework
spring-core
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-oxm
${spring.version}
org.springframework
spring-tx
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-test
${spring.version}
org.springframework
spring-jms
${spring.version}
org.quartz-scheduler
quartz
2.3.0
springtimer
web.xml
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*
springtimer
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc.xml
springmvc
*.htm
springmvc.xml
applicationContext-task.xml
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()));
//下面代码用来验证定时配置中 这个配置起到的作用
//案例:每隔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+"/";
%>
hello word
${name}