Spring 定时任务Scheduled 开发

文章目录

  • 一、前言
    • 1.1 定时任务
    • 1.2 开发环境
    • 1.3 技术实现
  • 二、创建包含WEB.xml 的Maven 项目
    • 2.1 创建多模块项目taskproject
    • 2.2 配置task-web 子模块Add Web
    • 2.3 配置Tomcat 运行Web 项目
  • 三、定时任务开发
    • 3.1 配置Spring
    • 3.2 编写自动任务类
    • 3.3 运行项目验证定时任务

一、前言

1.1 定时任务

Spring 框架的定时任务是基于Java 基础知识调度任务封装实现的;调度任务的实现方式多样,常见的有Java 本身工具类Timer,ScheduledExecutor 及开源工具Quartz、JCronTab。

1.2 开发环境

IDEA2018 + JDK1.8 + Tomcat8.0

1.3 技术实现

一般项目业务复杂或模块较多时会采用多模块创建项目,便于业务管理与开发。此处采用多模块形式(为了方便可以不用多模块),创建Maven 父项目taskproject,创建Maven 子模块task-service 作为普通模块,创建Maven 子模块task-web 作为web 模块。
    task-web 模块做web 处理,创建task-web/src/main/webapp/WEB-INF/web.xml。在task-web/src/main/resources 下新建Spring 配置文件。配置spring-context.xml 到web.xml。
    task-service 模块下创建业务类,即要定时执行的任务。task-web 模块引入task-service 模块的依赖,创建定时任务类,通过调用一个或多个业务类去定时执行具体的业务。
    本项目源码链接: https://github.com/niaonao/taskproject

二、创建包含WEB.xml 的Maven 项目

2.1 创建多模块项目taskproject

使用IDEA 创建Maven 项目taskproject,父模块taskproject 不编写的代码,此处删除父模块的src 文件夹。在taskproject 下依此创建Maven 子模块项目普通模块task-service 和Web 模块task-web。
图2-1-1、IDEA 创建Maven Project 图

    GroupId 和ArtifactId 坐标填写。
图2-1-2、自定义taskproject 项目坐标图

    删除父模块的src 文件夹。
图2-1-3、删除父模块src 文件夹图

    创建两个module 子模块task-service 和task-web。
图2-1-4、创建子模块Module 图

图2-1-5、创建子模块task-service 图

图2-1-6、创建子模块task-web 图

    此时项目结构图下
图2-1-7、多模块项目结构图一

    父模块pom.xml 引入子模块依赖、Spring 相关依赖及Web依赖。
2.1.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>pers.niaonao</groupId><artifactId>taskproject</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><!--自动添加子模块--><modules><module>task-service</module><module>task-web</module></modules><!--自定义属性,用作版本控制--><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><treasureFinal.version>1.0.0</treasureFinal.version><junit.version>4.11</junit.version><spring.version>4.3.3.RELEASE</spring.version><spring.remoting.version>2.0.8</spring.remoting.version><useragent.version>1.20</useragent.version><aspect.version>1.8.9</aspect.version></properties><!--依赖添加--><dependencies><!-- spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</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-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-beans</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-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</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-remoting</artifactId><version>${spring.remoting.version}</version></dependency><dependency><groupId>eu.bitwalker</groupId><artifactId>UserAgentUtils</artifactId><version>${useragent.version}</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspect.version}</version></dependency></dependencies></project>

子模块pom.xml 如下,其中task-web 引入了task-service 模块的依赖,这里会调用task-service 模块的业务类。
2.1.2 子模块task-service 的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"><!--自动引入父模块--><parent><artifactId>taskproject</artifactId><groupId>pers.niaonao</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>task-service</artifactId></project>

2.1.3 子模块task-web 的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"><parent><artifactId>taskproject</artifactId><groupId>pers.niaonao</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><!-- 设置打包方式为war --><packaging>war</packaging><!--引入要依赖的模块task-service --><dependencies><dependency><groupId>pers.niaonao</groupId><artifactId>task-service</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope></dependency></dependencies><artifactId>task-web</artifactId></project>

2.2 配置task-web 子模块Add Web

在task-web 模块右键选择功能菜单Open Module Settings 进行设置,在taskweb 模块添加Add Web
图2-2-1、taskweb 子模块Open Module Settings 图

图2-2-2、taskweb 子模块Add Web 图

    配置Web 资源文件夹Web Resource Directories,如下图2-2-3 所示,编辑Web Resource Directory,配置Web resource directory Path,在task-web 子模块的src/main 下新建webapp 文件夹webapp 作为Web 资源目录。
图2-2-3、配置taskweb 子模块Resource Directories 图

    配置Web 部署文件Deployment Descriptors,如下图2-2-4 所示,选中Project Structure 下的Facets 配置Web(taskweb)。编辑Type 为Web Module Deployment Descriptor 的path。在Web Module Deployment Descriptor(web.xml) 的taskproject/task-web/src/main/webapp 路径下新建WEB-INF,选中该路径后,在路径后添加\web.xml,此处通过向导创建Web 部署文件web.xml
图2-2-4、配置taskweb 子模块Deployment Descriptors 图

图2-2-5、配置taskweb 子模块web.xml 图

    依次点击Apply OK 即可。

2.3 配置Tomcat 运行Web 项目

在task-web 模块下的webapp 下新建index.jsp 文件

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
Task Project!
</body>
</html>

按如图所示进入Run/Debug Configurations,添加Tomcat Server,选择Local,在Application Server 选择本地解压缩的tomcat 的路径即可。
图2-3-1、IDEA 进入Edit Configurations 图

图2-3-2、配置Tomcat Server 图

    Tomcat Server 的Name 可以自定义,此处没做修改,默认为Unnamed。Application Server 点击Configure 选择配置本地的tomcat 即可。此时有个警告Warning:No artifacts configured 下面会进行artifacts 处理。
图2-3-3、配置Application Server 图

    双击IDEA 工作区右侧Maven Projects,选择task-web 下的package 双击打包(task-web 的pom.xml 文件已设置打包方式为war),生成war 包,如图2-3-5 所示。
图2-3-4、task-web 打包图

图2-3-5、task-web.war 图

    标记部署的文件,解决上一步的警告。
图2-3-6、标记部署文件 图

图2-3-7、解决artifacts 警告图

    依此点击Apply OK 应用即可,选中配置的tomcat(Unnamed)运行项目,运行项目的快捷键Ctrl + Alt + D/X。然后访问localhost:8080,此时能够访问到index.jsp。
图2-3-8、Run/Debug 运行图

三、定时任务开发

3.1 配置Spring

在子模块task-web 的src/main/resources 资源路径下新建spring 文件夹,新建Spring 配置文件spring-config.xml,定时任务配置文件spring-task.xml。
3.1.1 spring-config.xml
    下面配置中service 扫描包(pers.niaonao.taskservice,pers.niaonao.taskweb),后面编写Java 类时创建。

<?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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsd"><!--service注解扫描 --><context:component-scan base-package="pers.niaonao.taskservice,pers.niaonao.taskweb"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan><!-- 引入SPRING配置文件  --><import resource="classpath:spring/spring-task.xml"/></beans>

3.1.2 spring-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:task="http://www.springframework.org/schema/task"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.1.xsd"><!-- 定时任务扫描器 --><task:executor id="executor" pool-size="5"/><task:scheduler id="scheduler" pool-size="5"/><task:annotation-driven executor="executor" scheduler="scheduler"/>
</beans>

3.1.3 web.xml
    将Spring 配置到web.xml,通过Tomcat 部署项目,通过web.xml 加载Spring 配置。

<?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"><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/spring-config.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 防止spring内存溢出监听器 --><listener><listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class></listener>
</web-app>

3.2 编写自动任务类

在task-service 子模块的src/main/java 下创建package 包pers.niaonao.taskservice,创建用户资产任务类UserAssetTask.java,模拟要执行的任务。
    在task-web 子模块的src/main/java 下创建package 包pers.niaonao.taskweb,创建自动任务类AutoTask.java,引入用户资产任务,调用执行。
3.2.1 UserAssetTask.java

package pers.niaonao.taskservice;import org.springframework.stereotype.Service;/*** @Description :用户资产任务* @Author: niaonao* @Date: 2018/9/21 15:20*/
@Service(value = "userAssetTask")
public class UserAssetTask {/*** 平台用户资产更新任务,模拟一个要执行的任务*/public void platformUserAssetUpdate() {// 此处可调用你的service、util、entity 等,编写你的定时任务具体的业务代码System.out.println("平台用户资产更新完成!");}
}

3.2.2 AutoTask.java
    此处设置定时任务周期为10 S执行一次。通过注解@Scheduled(cron = "0/10 * * * * ? ")实现。此处不介绍Cron 表达式,需要了解可参考此链接内容

package pers.niaonao.taskweb;import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import pers.niaonao.taskservice.UserAssetTask;
import javax.annotation.Resource;/*** @Description :定时器* @Author: niaonao* @Date: 2018/9/21 15:17*/
@Component
public class AutoTask {@Resourceprivate UserAssetTask userAssetTask;/*** 用户资产定时更新任务* 10s 更新一次*/@Scheduled(cron = "0/10 * *  * * ? ")public void platformUserAssetUpdate() {userAssetTask.platformUserAssetUpdate();}
}

3.3 运行项目验证定时任务

此时项目结构图如图3-3-1所示。
图3-3-1、多模块项目结构图三

    再次通过Tomcat 运行(快捷键Alt + Shift + D)项目,可以在控制台看到定时任务在执行,此处是每间隔10s,打印一次内容。运行效果如图3-3-2 所示.
图3-3-2、定时任务运行效果图

简易且详细的 Scheduled 定时任务开发实战相关推荐

  1. 【Unity】动作游戏开发实战详细分析-15-可扩展的战斗系统

    [Unity]动作游戏开发实战详细分析-15-可扩展的战斗系统 系统设计 攻击信息传递 通常情况下,伤害.属性.判定都会被封装到类中,在触发动画事件后将战斗信息发送给受击者. 我们可以结合Unity碰 ...

  2. 全栈开发实战(一)——简易博客社区后端搭建教程(附源码)

    全栈开发实战(一)--简易博客社区后端搭建 项目展示视频 项目Github地址 (一)项目准备 在项目开始前,首先确保你已安装好Go语言并配置好Go语言编辑器,同时安装好MySQL或其他数据库,其次, ...

  3. 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(三)

    基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(三) 转载于:https://github.com/Meowv/Blog 本篇继续围绕抓取完成后的操作做一个提醒. ...

  4. 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(二)

    基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(二) 转载于:https://github.com/Meowv/Blog 本篇继续来完成一个全网各大平台的热点新闻 ...

  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(一)

    基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(一) 转载于:https://github.com/Meowv/Blog 本篇主要围绕定时任务和数据抓取相关的知识 ...

  6. 【Unity】动作游戏开发实战详细分析-07-连续技与组合技功能设计

    [Unity]动作游戏开发实战详细分析-07-连续技与组合技功能设计 基本思路 在一些动作游戏中,存在着连续技这一功能,具体来说就是连续按下规定的按键会触发能力的功能,或者是长按触发等等. 实现解析 ...

  7. 【Unity】动作游戏开发实战详细分析-16-敌人AI设计

    [Unity]动作游戏开发实战详细分析-16-敌人AI设计 基本思想 本文来实现简单的敌人AI,使用协程来开发AI.如果想要使用行为树插件可自行学习使用. 代码实现 敌人的目标信息结构 用于存储所有的 ...

  8. 【Unity】动作游戏开发实战详细分析-06-技能系统设计

    [Unity]动作游戏开发实战详细分析-06-技能系统设计 基本思想 不同的技能可以设计为技能模版,当角色释放技能时,会通过模版ID将它进行实例化,这个实例技能类可以是一个挂载的MonoBehavio ...

  9. 【Unity】动作游戏开发实战详细分析-25-角色残影效果的实现

    [Unity]动作游戏开发实战详细分析-25-角色残影效果的实现 基本思路 Unity中的蒙皮网格组件提供了一个接口BakeMesh,允许我们拿到当前动画帧的网格数据,借此可对烘焙网格使用半透明的边缘 ...

最新文章

  1. tf.keras.layers.Dropout 示例
  2. 如何在计算机配置里面设置隐藏c盘,玩转电脑组策略(指定运行程序/隐藏C盘)
  3. 在linux、optee、ATF中的中断异常向量表
  4. simulink中mpc模块怎么使用_Controllogix系统中ILX34MBS485模块使用
  5. 2011年上海交通大学计算机研究生机试真题
  6. struts1.3执行流程分析
  7. FlashCache初体验
  8. 什么是Java文件?
  9. python操作hive数据库代码_Python连接Hive操作数据库
  10. erp采购总监个人总结_《用友 ERP 培训教程:财务核算/供应链管理/物料需求计划》ERP概述 : ERP基础知识...
  11. android通过ContentProvider 取得电话本的数据
  12. matlab 神经网络工具箱的实用
  13. 电力线通信(Power Line Communication)简介
  14. 中国药科大学计算机专业排行,江苏省高校排名,榜首实至名归,江南大学仅排第10...
  15. 第四章:CPU体系结构笔记
  16. /usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.25.8
  17. 欢迎使用CSDN-markdown编辑器不啵啵啵啵啵啵啵啵啵啵啵啵
  18. 教你如何正确的去校验身份证
  19. 【亲测有效】解决PPT里多个图片无法使用组合功能
  20. 程序员进阶!阿里P7级别面试经验总结,深度好文

热门文章

  1. 基于深度学习GPU+FPGA 多路高清视频处理模块
  2. 微型计算机原理与接口技术 第三版(张荣标)答案
  3. 微信小程序·云开发,采坑第一趴
  4. php程序把图片变成漫画,用AI把真人照片变矢量漫画风格
  5. Error Code: 1318. Incorrect number of arguments for PROCEDURE account_check.temp_i; expected 1, got
  6. linux原生系统_技德发布JStack 2.0,在Linux系统中无缝运行移动应用
  7. Deeplearning4j - 入门视频
  8. “退微信群”谣言背后:总有人用阴谋论湮没常识
  9. 【转】深入理解Batch Normalization批标准化
  10. shell脚本--常用知识