SpringBoot中使用Scheduling执行定时任务

SpringBoot自带的 Schedule,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多
以下任务都是在单线程下执行的
第一步 创建SpringBoot项目
第二步 添加@EnableScheduling开启定时任务
第三步 设置定时需要执行的任务
有两种方法设置执行时机
第一种我们就且叫他为普通方法
1.fixedRate:会为所有任务的开始执行时间编排一个表,假如fixedRate=5000,且第一次开始时间是10:00:00
任务 开始执行时间
任务1 10:00:00
任务2 10:00:05
任务3 10:00:10
任务4 10:00:15
任务5 10:00:20br/>当执行任务耗时小于fixedRate设置的时间时,将会按照表中的开始时间执行任务,即每隔5秒会执行一个任务:
@Component
public class TestScheduling {
private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");br/>@Scheduled(fixedRate=5000)
public void myTask() throws InterruptedException {
LOG.info("执行时间:{}",sdf.format(new Date()));
}
}
当执行任务耗时大于fixedRate设置的时间时,以下一张图就很清楚的表示了(图的出处)
解析一下:
fixedRate设置的也是为fixedRate=5000
第一个任务开始执行时间是0:00,耗时8秒
第二个任务本应该开始执行时间是0:05,但是第一个任务执行完时间已经是0:08,所以第二个任务在第一个任务执行完毕之后会立即执行,耗时是3s
第三个任务本应该开始执行时间是0:10,但是前两个任务执行完毕时间已经是0:11,所以第三个任务在第二个任务执行完毕之后会立即执行,耗时是6s
第四个任务,也同第二、第三个任务一样,在预计开始执行的时间(这里第四个任务预计开始执行时间是0:15),因为上一个任务还没有执行完毕,所以要等待上一个人执行完毕之后才会执行。
第五个任务预计开始执行时间是0:20,而前四个任务在0:19已经执行完毕,需要等待1秒,到达我们预计的开始执行时间(0:20)才会执行第五个任务。

2.fixedDelaybr/>这个就比之前的fixedRate简单得多。如设置fixedRate=5000.下一个任务只需要盯着上一个任务的屁股(执行完毕的时间)就行了。上一个任务执行完毕5秒之后,下一个任务就会开始执行
@Component
public class TestScheduling {
private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
br/>@Scheduled(fixedDelay=5000)
public void myTask(){
LOG.info("开始执行时间:{}",sdf.format(new Date()));
try {
Thread.sleep(8000);//让任务执行的耗时时间为8秒,有利于我们的观察
} catch (InterruptedException e) {
e.printStackTrace();
}
LOG.info("执行完毕时间:{}",sdf.format(new Date()));
br/>}
}
3.initialDelay
用于配合fixedRate和fixedDelay使用的,作用是在容器启动后经过多长时间才开始执行第一次任务。
4.扩展一下
我们先看下一下@Scheduled注解里面有什么
?fixedDelayString、fixedRateString和initialDelayString不就是我们上面讲的三个加个字符串嘛,之前的三个都是long类型,这三个是String类型,顾名思义,不就是用字符串表示嘛。作用其实就是为了能在application.properties配置
br/>@Component
public class TestScheduling {
private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

@Scheduled(initialDelay = 5000,fixedDelayString = "${com.liang.scheduled:5000}")
public void myTask(){
    LOG.info("开始执行时间:{}",sdf.format(new Date()));
    try {
        Thread.sleep(8000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    LOG.info("执行完毕时间:{}",sdf.format(new Date()));
}

}
?:5000作用是防止application.properties没有配置com.liang.scheduled属性则使用默认的5000(如果没有写:5000且application.properties没有配置com.liang.scheduled属性会报异常)
执行结果:和我们预计的一样,下一次开始执行时间与上一次结束时间间隔正好是10秒。如果去掉application.properties中的com.liang.scheduled属性,XM返佣代理www.kaifx.cn/broker/xm.html,则间隔时间是默认的5秒,这个自行验证。
几乎大部分的应用都会有定时执行任务的需求。使用Spring Boot的Scheduling Tasks能够提高您的开发效率。这篇文章将介绍怎么通过Spring Boot去做调度任务。
br/>构建工程
创建一个Springboot工程,在它的程序入口加上@EnableScheduling,开启调度任务。
@SpringBootApplication
br/>@EnableScheduling
public class SpringbootScheduledApplication {

public static void main(String[] args) {
    SpringApplication.run(SpringbootScheduledApplication.class, args);
}

}
创建定时任务
创建一个定时任务,每过2s在控制台打印当前时间。

@Component
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

@Scheduled(fixedRate = 2000)
public void reportCurrentTime() {
    log.info("The time is : " + dateFormat.format(new Date()));
}

}

SpringBoot中使用Scheduling执行定时任务

原文地址:https://blog.51cto.com/14511863/2436250

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

SpringBoot中使用Scheduling执行定时任务的相关文章

SpringBoot中使用@Scheduled创建定时任务

SpringBoot中使用@Scheduled创建定时任务 定时任务一般会在很多项目中都会用到,我们往往会间隔性的的去完成某些特定任务来减少服务器和数据库的压力.比较常见的就是金融服务系统推送回调,一般支付系统订单在没有收到成功的回调返回内容时会持续性的回调,这种回调一般都是定时任务来完成的.还有就是报表的生成,我们一般会在客户访问量过小的时候来完成这个操作,那往往都是在凌晨.这时我们也可以采用定时任务来完成逻辑.SpringBoot为我们内置了定时任务,我们只需要一个注解@Scheduled就

Spring中使用quartz执行定时任务的两种方式

一, 继承spring封装Quartz类(org.springframework.scheduling.quartz.QuartzJobBean)方式 spring-mvc-quartz2.xml: <bean id="job2Trigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail">

在SpringBoot中配置定时任务

前言 之前在spring中使用过定时任务,使用注解的方式配置很方便,在SpringBoot中的配置基本相同,只是原来在spring中的xml文件的一些配置需要改变,在SpringBoot中也非常简单. 已经加入我的github模版中:https://github.com/LinkinStars/springBootTemplate 定时任务的分类 所谓定时任务,就是在项目启动之后,定时的去执行一个任务,从而满足业务的需要. 定时任务分为下面几种,串行,并行,同步,异步 串行,并行:当配置了多个定

SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)

# 一.在JAVA开发领域,目前可以通过以下几种方式进行定时任务 1.单机部署模式 Timer:jdk中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行.提供的功能比较单一,无法实现复杂的调度任务. ScheduledExecutorService:也是jdk自带的一个基于线程池设计的定时任务类.其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响. Spring Task:Spring提供的一个任务调度工具,支持注解和配置文件形式,支持Cron表达式,使用

在ASP.NET MVC4中使用Quartz.NET执行定时任务

本篇在ASP.NET MVC下实践使用Quartz.NET执行定时任务. 首先通过NuGet安装Quartz.NET. 使用Quartz.NET的大致思路是:1.实现IJob接口,定义具体要做的事情2.使用Quartz.NET的API定义定时任务规则3.在Application_Start注册定时任务 实现IJob接口. public class MyJob : IJob { public void Execute(IJobExecutionContext context) { Debug.Wr

java中服务器启动时,执行定时任务

package com.ripsoft.util; import java.util.Calendar; import java.util.Timer; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class TimerListener implements ServletContextListener{ private Timer timer = nu

.NET Core中使用IHostedService结合队列执行定时任务

最近遇到了这样的场景:每隔一段时间,需要在后台使用队列对一批数据进行业务处理. Quartz.NET是一种选择,在 .NET Core中,可以使用IHostedService执行后台定时任务.在本篇中,首先尝试把队列还原到最简单.原始的状态,然后给出以上场景问题的具体解决方案. 假设一个队列有8个元素.现在abcd依次进入队列. 0 1 2 3 4 5 6 7 a b c d head tail ab依次出队列. 0 1 2 3 4 5 6 7 c d head tail 可以想象,随着不断地入

spring执行定时任务

最常见的方法是使用任务调度框架Quartz 有两种方法,一是使用Spring提供的MethodInvokingJobDetailFactoryBean 代理类,Quartz通过该代理类直接调度任务类的某个函数:二是任务类继承并实现Quartz接口,Quartz通过该接口进行调度. 这里只实现方法一 首先创建一个函数,实现一个方法 ? 1 2 3 4 5 6 7 8 9 public interface TimerTest(){         void run();      } public

@Scheduled执行定时任务与cron表达式

1 配置文件形式执行定时任务 1 1.X 版本与spring结合使用实例 1.1 常用maven管理 pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://