全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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

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

<!-- 定时器依赖 开始 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>

 

<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<!-- 定时器依赖 结束 -->

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

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

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

 <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-*.xml</param-value>
  </context-param>

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

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

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

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

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

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

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

<?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: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"> 
 
    <!-- 启动触发器的配置开始 --> 
  <bean name="startQuertz" lazy-init="false" autowire="no" 
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="triggers"> 
      <list> 
        <ref bean="myJobTrigger" /> 
      </list> 
    </property> 
  </bean> 
  <!-- 启动触发器的配置结束 --> 
 
  <!-- 调度的配置开始 --> 
  <!-- 
    quartz-1.8以前的配置  
  <bean id="myJobTrigger" 
    class="org.springframework.scheduling.quartz.CronTriggerBean"> 
    <property name="jobDetail"> 
      <ref bean="myJobDetail" /> 
    </property> 
    <property name="cronExpression"> 
      <value>0/1 * * * * ?</value> 
    </property> 
  </bean> 
  --> 
  <!-- quartz-2.x的配置 --> 
  <bean id="myJobTrigger" 
    class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 
    <property name="jobDetail"> 
      <ref bean="myJobDetail" /> 
    </property> 
    <property name="cronExpression"> 
    
    <value>0/10 * * * * ?</value>
     <!--  <value>1 52 * * * ?</value> --> 
    </property> 
  </bean> 
  <!-- 调度的配置结束 --> 
 
  <!-- job的配置开始 --> 
  <bean id="myJobDetail" 
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
    <property name="targetObject"> 
      <ref bean="myJob" /> 
    </property> 
    <property name="targetMethod"> 
      <value>work</value> 
    </property> 
  </bean> 
  <!-- job的配置结束 --> 
 
  <!-- 工作的bean --> 
  <bean id="myJob" class="com.tec.kevin.quartz.jobTest" /> 
 
</beans>

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

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

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

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

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

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

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

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

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


# Spring  # 定时任务  # java中 spring 定时任务 实现代码  # SpringBoot定时任务两种(Spring Schedule 与 Quartz 整合 )实现方法  # 最流行的java后台框架spring quartz定时任务  # Spring Task定时任务的配置和使用详解  # spring 定时任务@Scheduled详解  # 详解Spring整合Quartz实现动态定时任务  # spring中定时任务taskScheduler的详细介绍  # 详解Spring Boot中使用@Scheduled创建定时任务  # Spring整合Quartz实现定时任务调度的方法  # Spring定时任务实现与配置(二)  # 就可以  # 的是  # 配置文件  # 才会  # 要注意  # 会报  # 这是  # 实现了  # 加载  # 就会  # 是在  # 会有  # 好了  # 在这个  # 走了  # 控制程序  # 说了  # 则是  # 其他的  # 两次 


相关文章: 制作电商网页,电商供应链怎么做?  如何选择CMS系统实现快速建站与SEO优化?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  建站10G流量真的够用吗?如何应对访问高峰?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  Thinkphp 中 distinct 的用法解析  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  高端建站三要素:定制模板、企业官网与响应式设计优化  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  ,柠檬视频怎样兑换vip?  建站之星北京办公室:智能建站系统与小程序生成方案解析  ppt制作免费网站有哪些,ppt模板免费下载网站?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  建站之星安装步骤有哪些常见问题?  如何快速完成中国万网建站详细流程?  已有域名和空间,如何快速搭建网站?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  如何在香港免费服务器上快速搭建网站?  如何快速搭建响应式可视化网站?  网站制作新手教程,新手建设一个网站需要注意些什么?  如何在Golang中使用replace替换模块_指定本地或远程路径  北京专业网站制作设计师招聘,北京白云观官方网站?  C#怎么创建控制台应用 C# Console App项目创建方法  宝塔面板创建网站无法访问?如何快速排查修复?  如何通过建站之星自助学习解决操作问题?  招商网站制作流程,网站招商广告语?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  建站主机解析:虚拟主机配置与服务器选择指南  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  建站主机如何选?性能与价格怎样平衡?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  如何使用Golang安装API文档生成工具_快速生成接口文档  Bpmn 2.0的XML文件怎么画流程图  如何用西部建站助手快速创建专业网站?  如何在宝塔面板中创建新站点?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  javascript中的try catch异常捕获机制用法分析  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  制作企业网站建设方案,怎样建设一个公司网站?  PHP正则匹配日期和时间(时间戳转换)的实例代码  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  香港服务器选型指南:免备案配置与高效建站方案解析  建站之星导航菜单设置与功能模块配置全攻略  如何选择适配移动端的WAP自助建站平台?  c# 在ASP.NET Core中管理和取消后台任务  如何在Golang中引入测试模块_Golang测试包导入与使用实践 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。