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 表达式。

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

(0)

相关推荐

  • Spring Task定时任务的配置和使用详解

    记录下Spring自带的定时任务用法. spring中使用定时任务 基于xml配置文件使用定时任务 首先配置spring开启定时任务 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/

  • java中 spring 定时任务 实现代码

    复制代码 代码如下: import org.apache.log4j.*;public class TaskJob {       public static Logger log = Logger                     .getLogger(TaskJob.class);       public void SayHello() {              // TODO Auto-generated method stub              try {      

  • Spring整合Quartz实现定时任务调度的方法

    最近项目中需要实现定时执行任务,比如定时计算会员的积分.调用第三方接口等,由于项目采用spring框架,所以这里结合spring框架来介绍. 编写作业类 即普通的pojo,如下: package com.pcmall.task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TaskA { private static Logger logger = LoggerFactory.getLogger(Ta

  • 最流行的java后台框架spring quartz定时任务

    配置quartz 在spring中需要三个jar包: quartz-1.8.5.jar.commons-collections-3.2.1.jar.commons-logging-1.1.jar 首先要配置我们的spring.xml xmlns 多加下面的内容. xmlns:task="http://www.springframework.org/schema/task" 然后xsi:schemaLocation多加下面的内容. http://www.springframework.o

  • spring 定时任务@Scheduled详解

    一.配置文件 <?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

  • 详解Spring Boot中使用@Scheduled创建定时任务

    我们在编写Spring Boot应用中经常会遇到这样的场景,比如:我需要定时地发送一些短信.邮件之类的操作,也可能会定时地检查和监控一些标志.参数等. 创建定时任务 在Spring Boot中编写定时任务是非常简单的事,下面通过实例介绍如何在Spring Boot中创建定时任务,实现每过5秒输出一下当前时间. 在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置 @SpringBootApplication @EnableScheduling publi

  • SpringBoot定时任务两种(Spring Schedule 与 Quartz 整合 )实现方法

    前言 最近在项目中使用到定时任务,之前一直都是使用Quartz 来实现,最近看Spring 基础发现其实Spring 提供 Spring Schedule 可以帮助我们实现简单的定时任务功能. 下面说一下两种方式在Spring Boot 项目中的使用. Spring Schedule 实现定时任务 Spring Schedule 实现定时任务有两种方式 1. 使用XML配置定时任务, 2. 使用 @Scheduled 注解. 因为是Spring Boot 项目 可能尽量避免使用XML配置的形式,

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

    接上一篇,原本我以为我实现的方式很简单了,在准备写(一)的时候,就去查了查别人是怎么实现定时任务的.不查还好,这一查,发现还有更简单的.所以就会有这篇文章. 本文主要是讨论,在完成Spring 项目搭建的情况下完成简单的定时任务实现. 在上一篇中,我们实现了"最简单"的定时任务,在那里我们是基于MAVEN管理包的依赖,依赖以下两个包: <!-- 定时器依赖 开始 --> <dependency> <groupId>org.springframewor

  • 详解Spring整合Quartz实现动态定时任务

    最近项目中需要用到定时任务的功能,虽然spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先,当然是添加依赖的jar文件,我的项目是maven管理的,以下的我项目的依赖: <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring

  • spring中定时任务taskScheduler的详细介绍

    前言 众所周知在spring 3.0版本后,自带了一个定时任务工具,而且使用简单方便,不用配置文件,可以动态改变执行状态.也可以使用cron表达式设置定时任务. 被执行的类要实现Runnable接口 TaskScheduler接口 TaskScheduler是一个接口,TaskScheduler接口下定义了6个方法 1.schedule(Runnable task, Trigger trigger); 指定一个触发器执行定时任务.可以使用CronTrigger来指定Cron表达式,执行定时任务

随机推荐