• SpringTask


    1.  Spring Task简介

    在实际开发中, 根据业务需求, 我们经常需要处理一些定时任务, 例如:每天凌晨备份一下数据, 每月清空一次日志, 页面广告一周之后过期, 每三个月清空一下cookie等等。目前最常见的实现定时任务的方式有三种:

    1. Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让程序按照某一个频度或间隔运行,但不能在指定时间运行, 一般用的较少。

    2. 使用Quartz,这是一个功能比较强大的的开源工具,可以让程序在指定时间运行,也可以按照某一个频度或间隔运行,配置起来稍显复杂。

    3. Spring 3.0以后自带task调度工具,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz更加简单方便, 我们这里重点讲解这种方式。

    2 开发环境准备
    2.1 创建项目并导入jar包
    创建一个Java Web项目SpringTaskTest1, 然后导入jar包, 如果你是Maven项目, 就在pom文件中引入spring-context和spring-web的坐标即可, 如下所示:

    <artifactId>Task</artifactId>
    
        <packaging>war</packaging>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.2.8.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>4.2.8.RELEASE</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.2</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                        <showWarnings>true</showWarnings>
                    </configuration>
                </plugin>
                <!-- 运行tomcat7方法:tomcat7:run -->
                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <version>2.2</version>
                    <configuration>
                        <!-- 指定端口 -->
                        <port>8080</port>
                        <!-- 请求路径 -->
                        <path>/</path>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.eclipse.jetty</groupId>
                    <artifactId>jetty-maven-plugin</artifactId>
                    <version>9.4.12.v20180830</version>
                    <!-- <configuration> <webApp> jetty默认contextPath为/,为了和tomcat保持一致,采用如下配置
                        <contextPath>/${project.artifactId}</contextPath> </webApp> </configuration> -->
                </plugin>
    
            </plugins>
        </build>

    2.2 配置文件

    要使用spring进行开发需要在web.xml中进行spring监听器的配置, 如下所示:

    <?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_2_5.xsd"
        id="WebApp_ID" version="2.5">
    
        <!-- spring配置文件位置 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
        <!-- spring核心监听器 -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
    </web-app>

    3 如何使用Spring Task
    3.1 纯XML配置方式
    3.1.1 简单定时任务
    定时任务中的业务功能我们按照常规的处理方式放到业务层实现, 所以首先编写一个业务层接口TaskService, 如下图所示:

    package com.topcheer.task;
    
    public interface TaskService {
        void firstTask();    //第一个定时任务
        void secondTask();   //第二个定时任务
    }

    接下来编写该接口的实现类TaskServiceImpl, 在该类中实现两个定时任务, 业务功能上做了简化处理, 只是往控制台输出一句话, 如下图所示:

    package com.topcheer.task;
    
    import java.util.Date;
    
    
    public class TaskServiceImpl implements TaskService{
    
        @Override
        public void firstTask() {
            System.out.println(new Date() +": 这是第1个定时任务");
        }
    
        @Override
        public void secondTask() {
            System.out.println(new Date() +": 这是第2个定时任务");
        }
    
    }

     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:context="http://www.springframework.org/schema/context"
        xmlns:task="http://www.springframework.org/schema/task"
        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/task http://www.springframework.org/schema/task/spring-task.xsd">
    
        <bean id="taskService" class="com.topcheer.task.TaskServiceImpl">
        </bean>
    
        <!-- 配置定时规则 -->
        <task:scheduled-tasks>
            <!-- 可以配置多个定时任务 -->
            <!-- <task:scheduled ref="taskService" method="firstTask"
                initial-delay="1000" fixed-delay="1000" />
            <task:scheduled ref="taskService" method="secondTask"
                initial-delay="2000" fixed-delay="3000" /> -->
                
            <task:scheduled ref="taskService" method="firstTask"
            cron="*/5 * * * * ?"/>
            
            <task:scheduled ref="taskService" method="secondTask"
            cron="0 45 14 * * ?"/>    
                
        </task:scheduled-tasks>
    
    </beans>

    日志:

    [INFO] Started o.e.j.m.p.JettyWebAppContext@7a5b769b{/,file:///E:/IdeaSpace/demo/Task/src/main/webapp/,AVAILABLE}{file:///E:/IdeaSpace/demo/Task/src/main/webapp/}
    [INFO] Started ServerConnector@285c6918{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
    [INFO] Started @10338ms
    [INFO] Started Jetty Server
    Tue Mar 17 18:16:30 CST 2020: 这是第1个定时任务
    Tue Mar 17 18:16:35 CST 2020: 这是第1个定时任务
    Tue Mar 17 18:16:40 CST 2020: 这是第1个定时任务
    Tue Mar 17 18:16:45 CST 2020: 这是第1个定时任务

    3.2 全注解方式
    除了采用XML配置的方式可以实现定时任务之外, spring也支持全注解的方式来实现定时任务。 为了跟上面的例子区分开, 接下来我们单独再创建一个项目SpringTaskTest2来演示。 创建项目并导入Jar包, 以及配置web.xml的过程跟上面的例子一模一样, 这里不再演示。
    我们可以直接在业务层的实现类中使用@Service注解, 该注解用到类上表示该类的对象由spring负责创建和管理, 等价于applicationContext.xml中的<bean>配置, @Scheduled注解用到方法上用于设置定时规则, 等价于applicationContext.xml中的<task:scheduled>配置, 具体代码如下图所示:

    @Service
    public class TaskServiceImpl implements TaskService{
    
        @Override
        @Scheduled(cron ="*/5 * * * * ?")
        public void firstTask() {
            System.out.println(new Date() +": 这是第1个定时任务");
        }
    
        @Override
        @Scheduled(cron ="*/6 * * * * ?")
        public void secondTask() {
            System.out.println(new Date() +": 这是第2个定时任务");
        }
    
    }

    xml配置

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:task="http://www.springframework.org/schema/task"
        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/task http://www.springframework.org/schema/task/spring-task.xsd">
    
        <context:component-scan base-package="com.topcheer.task"></context:component-scan>
    
        <task:annotation-driven></task:annotation-driven>
    
    </beans>

    日志:

    [INFO] Started ServerConnector@65afeb6d{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
    [INFO] Started @14663ms
    [INFO] Started Jetty Server
    Tue Mar 17 18:31:20 CST 2020: 这是第1个定时任务
    Tue Mar 17 18:31:24 CST 2020: 这是第2个定时任务
    Tue Mar 17 18:31:25 CST 2020: 这是第1个定时任务
    Tue Mar 17 18:31:30 CST 2020: 这是第2个定时任务
    Tue Mar 17 18:31:30 CST 2020: 这是第1个定时任务
    Tue Mar 17 18:31:35 CST 2020: 这是第1个定时任务
    Tue Mar 17 18:31:36 CST 2020: 这是第2个定时任务
    Tue Mar 17 18:31:40 CST 2020: 这是第1个定时任务
    Tue Mar 17 18:31:42 CST 2020: 这是第2个定时任务

     与springboot整合:https://www.cnblogs.com/dalianpai/p/11664353.html

  • 相关阅读:
    day14: 生成器进阶
    day13: 迭代器和生成器
    day12:装饰器的进阶
    day11:装饰器
    day10:函数进阶
    English class 81:How Vulnerability can make our lives better?
    piano class 12
    UE4之循环
    UE4之数组
    UE4中常见的类
  • 原文地址:https://www.cnblogs.com/dalianpai/p/12512625.html
Copyright © 2020-2023  润新知