摘要:对于定时任务类如果不定义线程池,控制台输出如下,可以看到不同的定时任务是同一个线程在执行在配置类或者启动类中增加定时任务的线程池控制台输出本节示例代码已上传到
一.SpringBoot中开启定时任务
在spirngboot中使用定时任务非常简单,只需要在启动类上增加一个@EnableScheduling注解即可。
@SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
对定时任务的类增加@Component注解,加入Spring的容器管理中
@Component public class ScheduleJob { ...... }
主要有三种定时的方式:
1.fixedRate
该属性的含义是上一个调用开始后再次调用的延时(不用等待上一次调用完成),这样就可能会存在任务重复执行的问题,所以不是建议使用,但数据量如果不大时在配置的间隔时间内可以执行完也是可以使用的。配置示例如下图5所示:
@Scheduled(fixedRate = 1000 * 1) public void fixedRateTask() throws InterruptedException { TimeUnit.SECONDS.sleep(2); System.out.println("执行 fixedRate 任务的时间:" + new Date(System.currentTimeMillis())); }
控制台输出:
任务触发的间隔都是2秒,说明该方法并没有等到执行完再开始下次执行(如果等待执行完应该需要3秒),而且看起来像一个单线程加队列的方式在执行。
2.fixedDelay
该属性的功效与上面的fixedRate则是相反的,配置了该属性后会等到方法执行完成后延迟配置的时间再次执行该方法。
@Scheduled(fixedDelay = 1000 * 1) public void fixedDelayTask() throws InterruptedException { TimeUnit.SECONDS.sleep(3); System.out.println("执行 fixedDelay 任务的时间:" + new Date(System.currentTimeMillis())); }
控制台输出结果:
3.cron表达式
@Scheduled(cron = "0/10 * * * * ?") public void cronTask() { System.out.println("执行 cron 任务的时间:" + new Date(System.currentTimeMillis())); }
控制台输出:
默认情况下,如果什么都不进行配置,就会导致一个问题,系统中所有的定时任务都是使用的一个线程去执行的,也就是说,如果如果同一个时刻有2个定时任务需要执行,那么只可能有一个定时任务在执行,如果要解决这个问题可以定义一个自定的任务调度线程池即可。
解决方案:
By default, will be searching for an associated scheduler definition: either a unique {@link org.springframework.scheduling.TaskScheduler} bean in the context, or a {@code TaskScheduler} bean named "taskScheduler" otherwise; the same lookup will also be performed for a {@link java.util.concurrent.ScheduledExecutorService} bean. If neither of the two is resolvable, a local single-threaded default scheduler will be created and used within the registrar.
上面这一段是从org.springframework.scheduling.annotation.EnableScheduling这个注解类上的一段注释。大致上就是我们定义一个TaskScheduler类型的bean即可解决这个问题。
对于定时任务类:
@Component public class ScheduleTreadTest { @Scheduled(cron = "0/3 * * * * ?") public void task01() { System.out.println(Thread.currentThread().getName() + "----> task01"); } @Scheduled(cron = "0/2 * * * * ?") public void task02() { System.out.println(Thread.currentThread().getName() + "----> task02"); } @Scheduled(cron = "0/3 * * * * ?") public void task03() { System.out.println(Thread.currentThread().getName() + "----> task03"); } }
如果不定义线程池,控制台输出如下,可以看到不同的定时任务是同一个线程在执行:
在配置类或者启动类中增加定时任务的线程池:
控制台输出:
本节示例代码已上传到github: https://github.com/liaosilzu2...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71043.html
摘要:多线程并发定时任务刚刚看了下实现定时任务的文章,感觉还不错。存在问题但是后来发现个问题,通过同时测试几个任务发现,所有的任务都是在同一个线程池中的同一个线程来完成的。 spring-boot | 多线程并发定时任务 刚刚看了下Spring Boot实现定时任务的文章,感觉还不错。Spring Boot 使用Spring自带的Schedule来实现定时任务变得非常简单和方便。在这里个大家...
摘要:当前时间打印当前时间定时任务触发,操作多个添加数据,事务中任一异常,都可以正常导致数据回滚。当前时间当前时间添加微服务启动类注解式配置定时任务,不支持任务调度。 SpringCloud(第 046 篇)注解式Schedule配置定时任务,不支持任务调度 - 一、大致介绍 1、很多时候我们需要隔一定的时间去执行某个任务,为了实现这样的需求通常最普通的方式就是利用多线程来实现; 2、但是有...
摘要:前情提要由于项目需要,需要一个定时任务集群,故此有了这个集群的实践。数据库表前缀在被认为失火之前,调度程序将容忍一个将其下一个启动时间通过的毫秒数。设置此实例检入与群集的其他实例的频率以毫秒为单位。影响检测失败实例的速度。 【前情提要】由于项目需要,需要一个定时任务集群,故此有了这个spring-boot-starter-quartz集群的实践。springboot的版本为:2.1.6...
本文将告诉你如何使用spring的任务调度。主要使用@Scheduled注解 需要会使用maven 第一步 pom.xml配置 4.0.0 org.xxz scheduled-task-test 1.0 org.springframework.boot spring-boot-starter-parent ...
摘要:时间年月日星期四说明本文部分内容均来自慕课网。哈希表实现命令,将哈希表中的域的值设为实现命令,返回哈希表中给定域的值实现命令,删除哈希表中的一个或多个指定域,不存在的域将被忽略。实现命令,返回哈希表中,所有的域和值。 时间:2018年04月19日星期四说明:本文部分内容均来自慕课网。@慕课网:https://www.imooc.com教学源码:https://github.com/zc...
阅读 2111·2023-04-26 00:41
阅读 1142·2021-09-24 10:34
阅读 3572·2021-09-23 11:21
阅读 4030·2021-09-22 15:06
阅读 1556·2019-08-30 15:55
阅读 896·2019-08-30 15:54
阅读 1828·2019-08-30 15:48
阅读 549·2019-08-29 13:58