springboot实现定时任务

薄洪涛6年前JAVA1501

之前做php的时候,如果想做个定时任务,或者想特定时间调用某个脚本/接口,我们都会考虑使用linux的crontab来实现,比较对于单线程脚本语言来说,做定时不是那么容易

然后最近因为开始学习java,就用到了springboot这个框架中的定时任务,所以记录下使用定时任务的步骤

  1. 主类application中开启@EnableScheduling 注解

    image.png

  2. 建立定时任务配置类,配置定时计划,定时要做的任务

@Component
public class ScheduledTask {
    val logger = LoggerFactory.getLogger(UserService::class.java)
    @Scheduled(cron = "0/5 * * * * ?")
    fun scheduled1() {
        val now = Timestamp.from(Instant.now())
        logger.info("定时任务调起 ${now}")
    }
}

然后run,你会发现你写的定时任务会自己跑起来了

image.png

当你写了主类中加了@EnableAsync,且第二步中的配置函数加了@Async,就是多线程了

注意,如果主类中你没有写@EnableAsync 的话,此时的定时任务是单线程的,是不是惊喜+意外,我们来证实一下

先试试多线程

import com.chocwell.blog.api.service.UserService
import org.slf4j.LoggerFactory
import org.springframework.scheduling.annotation.Async
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.sql.Timestamp
import java.time.Instant

@Component
public class ScheduledTask {
    val logger = LoggerFactory.getLogger(UserService::class.java)
    @Async
    @Scheduled(fixedDelay = 1000)
    fun scheduled1() {
        val now = Timestamp.from(Instant.now())
        logger.info("定时任务1调起 ${now}")
        Thread.sleep(5000)
    }
    @Async
    @Scheduled(fixedDelay = 2000)
    fun scheduled2() {
        val now = Timestamp.from(Instant.now())
        logger.info("定时任务2调起 ${now}")
        Thread.sleep(5000)
}
}

运行结果

image.png

这样你的定时任务1和2就互不干扰,并且单个任务的被调用的时间和其执行时间无关,因为每次运行都是一个新线程,可以看到sleep并没有影响定时任务的执行

注:使用了fixedDelay ,意思是上一次开始执行时间点之后多久开始执行下次任务

接来下,我们试试单线程,把@Async去掉试一下,清楚的看到,每次的任务都受sleep的影响

image.png

好了,这次的学习我学到了定时任务不是只有linux的crontab,springboot下的定时同样好用

相关文章

java相关日期函数

java相关日期函数

JDK7Data// 1.创建当前时间 Date d1 = new Date(); System.out.println(d1); // ...

centos安装java环境

centos安装java环境

很多工具(比如Lucene )都要依赖java环境,所以我在服务器上装了一个jdk,然后在这篇文章中记录下安装的步骤;当我们修改程序并通过SVN上传到服务器后环境:  &...

spring中什么情况下事务会失效?

事务失效的场景?权限问题,@Transactional 修饰的方法必须为public方法用final修饰或者是static方法,spring事务底层使用了aop,也就是通过jdk动态代理或者cglib...

Intellij IDEA实现热部署

Intellij IDEA实现热部署

每次修改代码都需要重新编译,然后重启Tomcat,比较麻烦,我们可以通过Jrebel实现项目的热部署,从而不需要重启Tomcat首先安装plugin如果在线安装时间比较长,可以选择自己下载包(点我自己...

基于dubbo改造现有http调用项目

使用zooker作为注册中心,将现有通过http调用的项目改造成dubbo调用公共项目规定接口public interface OrderService {  ...

spring循环依赖

spring循环依赖

什么是循环依赖? 很简单,就是A对象依赖了B对象,B对象依赖了A对象在Spring中,⼀个对象并不是简单new出来了,⽽是会经过⼀系列的Bean的⽣命周期,就是因为 Bean的⽣命周期所以才会出现循环...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。