SpringBoot实现定时任务的三种方式小结

网友投稿 259 2022-09-18


SpringBoot实现定时任务的三种方式小结

目录定时任务实现的三种方式使用Timer使用ScheduledExecutorService使用Spring Task1.简单的定时任务2.多线程执行

SpringBoot三种方式实现定时任务

定时任务实现的三种方式

Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。

ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。

Spring Task:Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。

使用Timer

这个目前在项目中用的较少,直接贴demo代码。具体的介绍可以查看api

public class TestTimer {

public static void main(String[] args) {

TimerTask timerTask = new TimerTask() {

@Override

public void run() {

System.out.println("task run:"+ new Date());

}

};

Timer timer = new Timer();

//安排指定的任务在指定的时间开始进行重复的固定延迟执行。这里是每3秒执行一次

timer.schedule(timerTask,10,3000);

}

}

使用ScheduledExecutorService

该方法跟Timer类似,直接看demo:

public class TestScheduledExecutorService {

public static void main(String[] args) {

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();

// 参数:1、任务体 2、首次执行的延时时间

// 3、任务执行间隔 4、间隔时间单位

service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);

}

}

使用Spring Task

1.简单的定时任务

在SpringBoot项目中,我们可以很优雅的使用注解来实现定时任务,首先创建项目,导入依赖:

org.springframework.boot

spring-boot-starter-web

orhttp://g.springframework.boot

spring-boot-starter

org.projectlombok

lombok

true

org.springframework.boot</groupId>

spring-boot-starter-test

test

创建任务类:

@Slf4j

@Component

public class ScheduledService {

@Scheduled(cron = "0/5 * * * * *")

public void scheduled(){

log.info("=====>>>>>使用cron {}",System.currentTimeMillis());

}

@Scheduled(fixedRate = 5000)

public void scheduled1() {

log.info("=====>>>>>使用fixedRate{}", System.currentTimeMillis());

}

http:// @Scheduled(fixedDelay = 5000)

public void scheduled2() {

log.info("=====>>>>>fixedDelay{}",System.currentTimeMillis());

}

}

在主类上使用@EnableScheduling注解开启对定时任务的支持,然后启动项目

可以看到三个定时任务都已经执行,并且使同一个线程中串行执行,如果只有一个定时任务,这样做肯定没问题,当定时任务增多,如果一个任务卡死,会导致其他任务也无法执行。

2.多线程执行

在传统的Spring项目中,我们可以在xml配置文件添加task的配置,而在SpringBoot项目中一般使用config配置类的方式添加配置,所以新建一个AsyncConfig类

@Configuration

@EnableAsync

public class AsyncConfig {

/*

此处成员变量应该使用@Value从配置中读取

*/

private int corePoolSize = 10;

private int maxPoolSize = 200;

private int queueCapacity = 10;

@Bean

public Executor taskExecutor() {

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

executor.setCorePoolSize(corePoolSize);

RymfL executor.setMaxPoolSize(maxPoolSize);

executor.setQueueCapacity(queueCapacity);

executor.initialize();

return executor;

}

}

@Configuration:表明该类是一个配置类

@EnableAsync:开启异步事件的支持

然后在定时任务的类或者方法上添加@Async 。最后重启项目,每一个任务都是在不同的线程中。

在线cron表达式生成:http://qqe2.com/cron/index


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:OSPF 八种状态机(ospf lsa类型详解)
下一篇:路由基础之OSPF链路状态数据库(ospf链路状态数据库中保存一个完整的路由表)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~