java 定时 spring_Spring定时任务实现与配置(一)

朋友的项目中有点问题。他那边是Spring架构的,有一个比较简单的需要定时的任务执行。在了解了他的需求之后,于是提出了比较简单的Spring+quartz的实现方式。

注意本文只是讨论,在已搭建完毕的Spring工程下,完成最简单的定时任务。

第一步,要知道Spring这个架构,很有趣很有意思。可以做到自由插拔功能模块的效果。工程项目是基于MAVEN包依赖管理的,所以把这次需要的依赖包引用列出来:

org.springframework

spring-context-support

4.0.2.RELEASE

org.quartz-scheduler

quartz

2.2.1

当然,这是要跟对应的Spring的版本是要匹配的。我们这里的工程是4.0.2。前一个包spring-context-support,主要的作用是作为Spring与quartz的沟通管理的部件,如果注释掉就会报这样的错误

4788158be1af1f1265d334192a0bdbc8.png

在MAVEN配置完所需要添加的包之后(其他的包,这里暂时不扩展开说了,本文只讨论在完整Spring工程项目下的配置),我们就可以开始动手给这个项目添加,定时任务的功能模块了。

第二步,从web的项目的起源,web.xml 中改动做起。由于原本的项目Spring的配置文件是Spring-mvc.xml,我这里就把定时任务的配置文件改成了spring-time.xml。这样就可以通过同一个扫描的配置在启动的时候去读取了。具体的代码如下:

contextConfigLocation

classpath:spring-*.xml

然后给大家看一下我的工程结构:

bedb40fcab2b51bab9a032d4d8f69104.png

通过这样的配置,项目就会知道怎么去调用了。实现了这一步接下来我们就可以继续往下走了;

第三步,就是要完成spring-timer.xml这个定时任务的核心配置了。在这个文件配置中,我们主要是完成三件事情:

1.配置启动的设置,关于懒加载(简单说一下,比如把某个变量初始化为null,也是一种懒加载,即在服务启动之后,只有在实际被调用的时候才会实例化,否则是不会在内存中存在的,只是逻辑上的。可以省空间,但是也可能会导致,问题延迟很久才会被发现,此处不再详细解说),以及触发器的配置;

2.quartz-2.x的配置,包含定时任务触发之后要调用的job的名字,以及corn表达式(即定时表达式,控制程序在何时重复执行的原因,本次在会在后续补充关于cron表达式的内容);

3.配置job的内容和job对应的具体的类。

好了逻辑流程解说完毕,上代码:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">

0/10 * * * * ?

class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

work

完成这里的配置文件配置之后,就可以开始下一步,具体的业务逻辑实现了;

第四步,具体业务逻辑实现。

这里要注意的是下图中的两个点

0b4b8d954aed7be53936e986e08cff4f.png

上图是具体的业务实现的类,里面的名字和下图定时任务配置的要相同。

完成上述之后,我们可以启动项目看看实际效果了。

f36072eabdc7156c6cb0816319aec2bc.png

这里可以看到,定时任务按照我们之前在配置中的 0/10 * * * * ? 每10秒执行一次 来运行了。

2fc997e972ef2df28efb6c90d0edf2d7.png

要注意的是,在实现这个方法的过程中,我遇到了重复执行的情况。就是同一个时间,执行了两次。后来找到的原因是在配置web.xml的时候,重复配置了定时任务,这样导致执行了多次。要是有遇到这个情况的,可以参考我的解决方法。

接来下会有两篇文章,一篇是写定时任务的更简单的实现方法,另外一篇讲解cron 表达式。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内核同步机制

内核中用于临界区保护下的互斥机制,它包括自旋锁、原子操作和信号量,三者保证了对临界资源访问的互斥型。 1.1 内核中的互斥机制 1.1.1 自旋锁 自旋锁用在多个CPU系统中。当一个线程在一个CPU上正使用资源,而另一个线程在另一个CPU上正忙等待…

makefile运行_NVDIA TX2入门 系列之三:运行Yolov3

上篇TX2安装完成OpenCV 3.4.0之后,基本软件包已经安装完成,本篇开始安装并运行大名鼎鼎的号称速度最快的目标识别分类算法Yolov3。Yolov3 是啥啊Yolov3是一款基于darknet深度学习框架的目标检测开源项目,目前已经发展到第3版本,即…

.NET7之MiniAPI(特别篇):.NET7 Preview3

.NET7的第三个预览版发布了,同样带来了mini api的更新,这次带来了路由过滤器,与mvc版的action 过滤器相似。具体见https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-dotnet-7-preview-3/用官方的代码,跑不起来&…

C#实现树的双亲表示法

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace 树的实现 {public partial class Form1 : Form{public Form1(){Init…

C++编译之提示ld: can‘t open output file for writing: test1, errno=21 for architecture x86_64

1 问题 在mac 终端写了一个cpp文件,然后用命令编译运行提示错误如下 1111deMBP:code a1111$ g -stdc11 test1.cpp -o test1 ld: cant open output file for writing: test1, errno21 for architecture x86_64 clang: error: linker command failed with exit code…

MySQL存储写入速度慢分析

一、存储结构分析MySQL存储结构图:解析:1、读操作:内存读-->cache缓存读-->磁盘物理读读取到的数据会按上述顺序往回送。2、写操作:内存数据直接写入cache缓存(非常快)-->写入disk由上可知,MySQL之所以读写速…

windows 建立wifi热点

1、以管理员身份运行命令提示符:netsh wlan set hostednetwork modeallow ssidmywifi key123456其中ssid为wifi名称,key为wifi密码。2、设置Internet连接共享:在“网络连接”窗口中,右键单击已连接到Internet的网络连接&#xff0…

【C语言简单说】一:第一个C语言程序

注册CSDN有些年头了,但是从未写过任何任何的东西。 几年前的懵懵懂懂,现在虽然依旧懵懂但是还好,能够听得懂大触们大致再说神马东西了。 这段时间有点怀疑人生,由于本人才疏学浅,所以只好留下一点帮助小白级入门的干货…

腾讯视频VIP会员,周卡特价9元!腾讯官方直充,会员立即生效!

腾讯视频新剧热播,但去广告必须是腾讯视频VIP会员,今天就给大家推荐特价充值腾讯视频VIP会员的平台——幻海优品,官方在线直充,会员秒到!腾讯视频VIP会员特价充值周卡:原价12元,特价9元月卡&…

google+stackoverflow_哪些开发问题最让程序员“头秃”?我们分析了Stack Overflow的11000个问题...

作者 | Nick Roberts编译 | AI科技大本营(ID:rgznai100)自 2008 年成立以来,Stack Overflow 一直在拯救所有类型的开发人员。自那时以来,开发人员提出了数百万个关于开发领域的问题。但是,迫使开发者转向 Stack Overflow 的问题都是什么呢&am…

Android 中的接口回调

Android 中的接口回调转载于:https://www.cnblogs.com/zhujiabin/p/5223806.html

java 获取接口的注解_java反射注解妙用-获取所有接口说明

前言最近在做项目权限,使用shiro实现restful接口权限管理,对整个项目都进行了重构。而权限管理需要用到所有的接口配置,包括接口url地址,接口唯一编码等。想要收集所有的接口信息,如果工程接口很多,工作量可想而知。这…

C#窗体的Load事件与Shown事件的区别

Load&#xff1a;在第一次显示窗体前发生。 <pre name"code" class"csharp"> private void Form1_Load(object sender, EventArgs e){} Shown&#xff1a;只有在首次显示窗体时才会引发 Shown 事件&#xff1b;随后执行的最小化、最大化、还原、隐藏…

在CentOS7.0上制作openstack-juno本地yum源 .doc

在CentOS7.0上制作openstack-juno本地yum源参考文献&#xff1a; 2014/09/27 | http://www.kekeyun.net/?p222可可云计算网以http://www.kekeyun.net/?p222文为参考&#xff0c;在CentOS7.0上制作本地源&#xff0c;过程如下&#xff1a;一、创建CentOS7虚拟主机安装过程有…

【C语言简单说】二:第一个C语言程序详解(1)

如有错误请给与纠正… 上一个教程只说明了第一个C语言程序源码中的&#xff1a; printf("Hello Wrold!"); 这行代码的含义&#xff0c;现在我们来说说全部代码&#xff1b;当然为了各位的方便&#xff0c;我就把那个代码给复制过来了&#xff0c;如下: #include&…

C++之智能指针和普通指针单例模式两种实现

1 问题 实现c++的单例模式,这里测试分别写了通过智能指针返回对象和普通返回指针 2 代码测试 include <iostream> #include <mutex> #include <memory>using namespace std;class Single { public:static Single& getInstance(){std::mutex mt;if (…

mybatis 返回 插入的主键

2019独角兽企业重金招聘Python工程师标准>>> 一般返回的是 数据库的 自增的 主键&#xff0c;&#xff0c;&#xff0c; 百度了一通&#xff0c;&#xff0c;我 刚开始 以后 可以 通过 插入的方法的&#xff0c;&#xff0c; 返回值 可以获取到 自增的主键&#xff…

Source Generator实战

前言最近刷B站的时候浏览到了老杨的关于Source Generator的简介视频。其实当初.Net 6刚发布时候看到过微软介绍这个东西&#xff0c;但并没有在意。因为粗看觉得这东西限制蛮多的&#xff0c;毕竟C#是强类型语言&#xff0c;有些动态的东西不好操作&#xff0c;而且又有Fody、N…

python图片解析库_python用来获得图片exif信息的库实例分析

本文实例讲述了python用来获得图片exif信息的库用法。分享给大家供大家参考。具体分析如下&#xff1a; exif-py是一个纯python实现的获取图片元数据的python库&#xff0c;官方下载地址&#xff1a; http://exif-py.svn.sourceforge.net/viewvc/exif-py/source/EXIF.py?revis…