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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 定时任务实现 以及无法正常执行分析相关的知识,希望对你有一定的参考价值。

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定时任务就算是完成了,两种方法均可正常运行。


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


本文出自 “xxxxxxxxxxx” 博客,请务必保留此出处http://huxy534.blog.51cto.com/9338042/1924644

以上是关于Spring 定时任务实现 以及无法正常执行分析的主要内容,如果未能解决你的问题,请参考以下文章

使用spring@Scheduled进行任务定时

Spring+Quartz框架实现定时任务(集群,分布式)

java定时执行任务为啥没有执行

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

Spring定时任务的实现

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