Spring 定时任务实现 以及无法正常执行分析

背景:使用quartz时客户现场不知道为什么跑着跑着就停了,后来决定换成spring定时任务。

按道理使用spring 定时任务应该是很简单的,不过还是踩到一些坑,下面记录过程并逐一分析说明,供以后参考;

1、使用注解的形式完成执行定时任务

1.1 applicationContext.xml中要包含对类扫描声明,以及开启task定时任务注解声明(如下)

<context:component-scan base-package="com.carnation" />

<task:annotation-driven />

1.2 完成自己的task相关类,并做配置如下

@Component

@Lazy(false)     //当application.xml中default-lazy-init="true"时,这里lazy必须是false

@EnableScheduling

public class HeBeiTask1 {

@Scheduled(cron = "0 0/2 * * * ?")

public void doTask(){

。。。。。。

doMyJob();

}

private void doMyJob(){

。。。。。。

}

}

1.3 踩坑记录-无法正常执行

(1)如果在spring中配置了default-lazy-init="true"的话,这里一定要有@Lazy(false),否则不执行;

(2)如果使用spring4 的话,据说@EnableScheduling必须要加上,否则也可能不执行(spring3 是不需要的);

(3)定时方法上@Scheduled的配置,及cron表达式的正确性

(4)当然最基础的一点是你的类一定要能被spring管理到(@Component)

2、使用xml配置的形式完成执行定时任务

2.1 applicationContext.xml中要包含任务类的注册,并配置task:scheduled-tasks及task:scheduled,参考如下

<bean name="stdTask1" class="com.carnation.quartz.HeBeiTask1" lazy-init="false"></bean> <!--看情况分析这里是否要有lazy-init="false"-->

<bean name="stdTask2" class="com.carnation.quartz.HeBeiTask2" lazy-init="false"></bean>

<bean name="stdTask3" class="com.carnation.quartz.HeBeiTask3" lazy-init="false"></bean>

<task:scheduled-tasks>

<task:scheduled ref="stdTask1" method="doTask" cron="0 0/2 * * * ?"/>

<task:scheduled ref="stdTask2" method="doTask" cron="0 0/5 * * * ?"/>

<task:scheduled ref="stdTask3" method="doTask" cron="0 0/2 * * * ?"/>

</task:scheduled-tasks>

2.2 完成自己的task相关类,非常简单参考如下:

public class HeBeiTask2 {

private Logger logger = Logger.getLogger(HeBeiTask2.class);

@Autowired

StandardColumnService standardColumnService;

public void doTask(){

try {

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

logger.debug(sdf.format(new Date())+" HeiBeiTask-2 for SyncMetaDataJob1 开始执行");

doMyJob();

} catch (Exception e) {

logger.error("HeiBeiTask2异常",e);

}

}

private void doMyJob(){

。。。。。。

}

2.3 踩坑记录-无法正常执行

如果在spring中配置了default-lazy-init="true"的话,这里一定要有lazy-init="false",否则不执行;

到此,spring定时任务就算是完成了,两种方法均可正常运行。

但出现问题了,在执行的时候发现会有重复执行的问题。

时间: 2024-10-21 07:14:37

Spring 定时任务实现 以及无法正常执行分析的相关文章

使用Spring定时任务并且通过AOP监控任务执行情况

原文:http://www.open-open.com/code/view/1426250803279 本文讲的是通过Spring注解的方式实现任务调度.只要引入了spring-context包就能够在项目中使用注解方式的任务调度. 下面看具体配置 需要在Spring配置文件中加入task的schema. <xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http:/

Spring 定时任务重复执行的问题分析

背景:使用quartz时客户现场不知道为什么跑着跑着就停了,后来决定换成spring定时任务. 当使用spring定时任务时莫名奇妙的就是同一时间重复执行多次任务(通常情况下执行两次,有时候会达到3次).下面记录过程并逐一分析说明,供以后参考: 1.分析原因后发现是由ClassPathXmlApplicationContext导致 通过n多次试验发现: 当任务方法中不含任何业务逻辑时(如:只打印一些标志性的信息),任务能够正常执行,没有重复执行的现象: 当任务方法中包含业务逻辑,或应用程序执行别

spring定时任务执行两次的原因与解决方法

spring定时任务,本地执行一次,放到服务器上后,每次执行时会执行两次,原因及解决办法. http://blog.csdn.net/yaobengen/article/details/70312663 spring定时任务执行两次的原因与解决方法

Spring定时任务的几种实现

Spring定时任务的几种实现: 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合 spring框架来介绍. 一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,也能在指定时间运行.一般用的较少,

(转)Spring定时任务的几种实现

Spring定时任务的几种实现 转自http://gong1208.iteye.com/blog/1773177 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合 spring框架来介绍. 一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.

spring定时任务的几种实现方式

Spring定时任务的几种实现 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合 spring框架来介绍. 一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行.一般用的较少,

关于Spring定时任务(定时器)用法

Spring定时任务的几种实现 Spring定时任务的几种实现 一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): 从作业类的继承方式来讲,可以分为两类: 从任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种: 二.用法说明 Quartz 第一种,作业类继承自特定的基类:org.springframework.scheduling.quartz.QuartzJobBean. 第二种,作业类不继承特定基类. Spring-Task 第一种:配置文件方式 第

(3)Spring定时任务的几种实现

Spring定时任务的几种实现 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合 spring框架来介绍. 一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行.一般用的较少,

转 Spring定时任务的几种实现 (记录备用)

http://gong1208.iteye.com/blog/1773177 Spring定时任务的几种实现 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合 spring框架来介绍. 一.分类 从实现的技术上来分类,目前主要有三种技术(或者说有三种产品): Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用