简易且详细的 Scheduled 定时任务开发实战
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 定时任务开发实战相关推荐
- 【Unity】动作游戏开发实战详细分析-15-可扩展的战斗系统
[Unity]动作游戏开发实战详细分析-15-可扩展的战斗系统 系统设计 攻击信息传递 通常情况下,伤害.属性.判定都会被封装到类中,在触发动画事件后将战斗信息发送给受击者. 我们可以结合Unity碰 ...
- 全栈开发实战(一)——简易博客社区后端搭建教程(附源码)
全栈开发实战(一)--简易博客社区后端搭建 项目展示视频 项目Github地址 (一)项目准备 在项目开始前,首先确保你已安装好Go语言并配置好Go语言编辑器,同时安装好MySQL或其他数据库,其次, ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(三)
基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(三) 转载于:https://github.com/Meowv/Blog 本篇继续围绕抓取完成后的操作做一个提醒. ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(二)
基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(二) 转载于:https://github.com/Meowv/Blog 本篇继续来完成一个全网各大平台的热点新闻 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(一)
基于 abp vNext 和 .NET Core 开发博客项目 - 定时任务最佳实战(一) 转载于:https://github.com/Meowv/Blog 本篇主要围绕定时任务和数据抓取相关的知识 ...
- 【Unity】动作游戏开发实战详细分析-07-连续技与组合技功能设计
[Unity]动作游戏开发实战详细分析-07-连续技与组合技功能设计 基本思路 在一些动作游戏中,存在着连续技这一功能,具体来说就是连续按下规定的按键会触发能力的功能,或者是长按触发等等. 实现解析 ...
- 【Unity】动作游戏开发实战详细分析-16-敌人AI设计
[Unity]动作游戏开发实战详细分析-16-敌人AI设计 基本思想 本文来实现简单的敌人AI,使用协程来开发AI.如果想要使用行为树插件可自行学习使用. 代码实现 敌人的目标信息结构 用于存储所有的 ...
- 【Unity】动作游戏开发实战详细分析-06-技能系统设计
[Unity]动作游戏开发实战详细分析-06-技能系统设计 基本思想 不同的技能可以设计为技能模版,当角色释放技能时,会通过模版ID将它进行实例化,这个实例技能类可以是一个挂载的MonoBehavio ...
- 【Unity】动作游戏开发实战详细分析-25-角色残影效果的实现
[Unity]动作游戏开发实战详细分析-25-角色残影效果的实现 基本思路 Unity中的蒙皮网格组件提供了一个接口BakeMesh,允许我们拿到当前动画帧的网格数据,借此可对烘焙网格使用半透明的边缘 ...
最新文章
- tf.keras.layers.Dropout 示例
- 如何在计算机配置里面设置隐藏c盘,玩转电脑组策略(指定运行程序/隐藏C盘)
- 在linux、optee、ATF中的中断异常向量表
- simulink中mpc模块怎么使用_Controllogix系统中ILX34MBS485模块使用
- 2011年上海交通大学计算机研究生机试真题
- struts1.3执行流程分析
- FlashCache初体验
- 什么是Java文件?
- python操作hive数据库代码_Python连接Hive操作数据库
- erp采购总监个人总结_《用友 ERP 培训教程:财务核算/供应链管理/物料需求计划》ERP概述 : ERP基础知识...
- android通过ContentProvider 取得电话本的数据
- matlab 神经网络工具箱的实用
- 电力线通信(Power Line Communication)简介
- 中国药科大学计算机专业排行,江苏省高校排名,榜首实至名归,江南大学仅排第10...
- 第四章:CPU体系结构笔记
- /usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.25.8
- 欢迎使用CSDN-markdown编辑器不啵啵啵啵啵啵啵啵啵啵啵啵
- 教你如何正确的去校验身份证
- 【亲测有效】解决PPT里多个图片无法使用组合功能
- 程序员进阶!阿里P7级别面试经验总结,深度好文
热门文章
- 基于深度学习GPU+FPGA 多路高清视频处理模块
- 微型计算机原理与接口技术 第三版(张荣标)答案
- 微信小程序·云开发,采坑第一趴
- php程序把图片变成漫画,用AI把真人照片变矢量漫画风格
- Error Code: 1318. Incorrect number of arguments for PROCEDURE account_check.temp_i; expected 1, got
- linux原生系统_技德发布JStack 2.0,在Linux系统中无缝运行移动应用
- Deeplearning4j - 入门视频
- “退微信群”谣言背后:总有人用阴谋论湮没常识
- 【转】深入理解Batch Normalization批标准化
- shell脚本--常用知识