Spring自带定时器实现定时任务

在Spring框架中实现定时任务的办法至少有2种(不包括Java原生的Timer及Executor实现方式),一种是集成第三方定时任务框架,如无处不在的Quartz;另一种便是Spring自带的定时器(仅针对3.0之后的版本)。本文将围绕Spring自带定时器,模拟实现一个最简单的定时任务,看看使用起来到底有多简单。

  1. 第二步,启动Schedule配置,XML方式的配置请自行搜索,本文仅针对注解方式的实现提供说明。

@EnableScheduling

@EnableScheduling注解,用来引入Schedule的相关配置,从其源码可见一斑。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({SchedulingConfiguration.class})
@Documented
public @interface EnableScheduling {
}

而SchedulingConfiguration的关键,则是定义ScheduledAnnotationBeanPostProcessor。顾名思义,针对基于注解的Bean组件,进行Scheduled处理。

  1. 第二步,在需要定时执行的方法上添加注解
    @Scheduled(fixedDelay = 5000L)
    @Scheduled(fixedRate = 5000L)
    @Scheduled(cron = "xxx")

阅读Scheduled源码,

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
    String cron() default "";
    String zone() default "";
    long fixedDelay() default -1L;
    String fixedDelayString() default "";
    long fixedRate() default -1L;
    String fixedRateString() default "";
    long initialDelay() default -1L;
    String initialDelayString() default "";
}

发现这个注解的Target,仅适用于方法和其他注解类型,可重复。参数包括zone - 时区,fixedRate-固定启动频率(单位毫秒),fixedDelay-固定执行周期(单位毫秒),cron-自定义Cron表达式。

fixedRate和fixedDelay的区别很简单,一个是开始时间按照一个固定的频率执行,不管之前的有没有结束,另一个从上一个任务结束到下一个任务的开始,按照固定的时间间隔。写个简单的sample看下效果:

@Component
public class SpringTaskDemo {

    private int round = 0;

    @Scheduled(fixedRate = 5000L)
    public void counting(){
        round++;
        System.out.println(">>>>>>>>>" + "Counting Round " + round);
        System.out.println("Start at : " + new DateFormatter("yyyy-MM-dd HH:mm:sss").print(new Date(), Locale.CHINESE));
        try {
            Thread.sleep(3000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Finish at: "+ new DateFormatter("yyyy-MM-dd HH:mm:sss").print(new Date(), Locale.CHINESE));
    }
}

fixedRate 效果如下:

>>>>>>>>>Counting Round 1
Start at : 2018-09-03 00:28:023
Finish at: 2018-09-03 00:28:026
>>>>>>>>>Counting Round 2
Start at : 2018-09-03 00:28:028
Finish at: 2018-09-03 00:28:031
>>>>>>>>>Counting Round 3
Start at : 2018-09-03 00:28:033
Finish at: 2018-09-03 00:28:036
>>>>>>>>>Counting Round 4
Start at : 2018-09-03 00:28:038
Finish at: 2018-09-03 00:28:041
>>>>>>>>>Counting Round 5
Start at : 2018-09-03 00:28:043
Finish at: 2018-09-03 00:28:046

fixedDelay效果如下:

>>>>>>>>>Counting Round 1
Start at : 2018-09-03 00:30:031
Finish at: 2018-09-03 00:30:034
>>>>>>>>>Counting Round 2
Start at : 2018-09-03 00:30:039
Finish at: 2018-09-03 00:30:042
>>>>>>>>>Counting Round 3
Start at : 2018-09-03 00:30:047
Finish at: 2018-09-03 00:30:050
>>>>>>>>>Counting Round 4
Start at : 2018-09-03 00:30:055
Finish at: 2018-09-03 00:30:058
>>>>>>>>>Counting Round 5
Start at : 2018-09-03 00:31:003
Finish at: 2018-09-03 00:31:006

这么看起来,其自带的定时任务,还是很准时的。cron表达式支持定义更为复杂的任务周期,关于cron的例子不再枚举,请自行搜索并测试。

原文地址:http://blog.51cto.com/10705830/2169251

时间: 2024-10-29 19:10:10

Spring自带定时器实现定时任务的相关文章

使用spring自带定时器: @Scheduled

项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息之类的.平时使用Quartz比较多,但配置相对麻烦一点.今天就来说说Spring自带的定时任务. Spring自带实现定时任务有两种方式,一种是通过注解的方式实现,一种是通过在配置文件中配置后实现. 一.通过spring的注解( @Scheduled)实现定时任务. 首先当然是Springde 配置: 第一步:添加这三段: xmlns:task="http://www.springframework.org/sche

spring自带定时器

http://www.cnblogs.com/pengmengnan/p/6714203.html 注解模式的spring定时器1 , 首先要配置我们的spring.xmlxmlns 多加下面的内容.xmlns:task="http://www.springframework.org/schema/task " 然后xsi:schemaLocation多加下面的内容.1. http://www.springframework.org/schema/task 2. http://www.

SpringMVC整合Quartz实现定时任务和Spring自带Task定时任务

一.Quartz定时任务1.引入quartz 导入quartz.jar包,或者pom.xml 配置对应的依赖: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>1.8.6</version> </dependency> 2. Web.xml配置在Web项目web.xml中配

spring启动quartz定时器

在很多中经常要用到定时任务,quartz是定时器中比较好用的,在Spring中使用quartz是很容易的事情,首先在spring的applicationContext.xml文件中增加如下配置: <!-- quartz定时器定义 --> <!-- 要调用的工作类,即任务处理类 --> <bean id="quartzJob" class="com.mdnet.travel.core.model.QuartzJob"></be

Spring 的@Scheduled注解实现定时任务执行和调度

首先要配置我们的spring.xml   ---  即spring的主配置文件(有的项目中叫做applicationContext.xml或context.xml) xmlns 多加下面的内容. [html] view plaincopy xmlns:task="http://www.springframework.org/schema/task" 然后xsi:schemaLocation多加下面的内容. [html] view plaincopy http://www.springf

spring中quatz的多定时任务配置图文详解

近来公司让用quatz框架做定时功能,而且还是执行多定时任务,真是苦恼. 虽然从网上搜了很多资料,但是写法上不太尽如人意,最后还是请教了螃蟹大神,给的配置建议就是简单啊,现在拿来分享下: 这里我们需要的有两部分,一个是java中的处理类,一个是quatz的配置文件,截图如下applicationContext_quartz.xmlquatz的配置文件地址地址:http://www.itxxz.com/a/kuangjia/kuangjiashili/2014/0602/10.html java中

spring自带测试配置

spring自带的测试注解 @ContextConfiguration(locations="classpath:applicationContext.xml")@RunWith(SpringJUnit4ClassRunner.class) public class TestUserDaoImpl extends AbstractJUnit4SpringContextTests{ @Autowired UserDao userDao; //TODO } classpath:applic

Spring自带mock测试Controller

转自:http://blog.csdn.net/yin_jw/article/details/24726941 分类: Spring开源框架2014-04-29 17:01 1786人阅读 评论(2) 收藏 举报 Spring自带mock测试Contro 准备SpringMVC环境 注意:使用mock测试需要引入spring-test包 Base类:加载配置文件 [java] view plaincopy package com.wyy.snail.user.controller; import

aop 注解 开启spring自带的事务

一些基本知识 可以 http://jinnianshilongnian.iteye.com/blog/1415606 serviceImpl.java 1 package cn.us.service.impl; 2 3 import java.util.List; 4 import java.util.UUID; 5 6 import javax.annotation.Resource; 7 8 import org.springframework.beans.factory.annotatio