简单示例

导入依赖

springBoot已经默认集成了定时任务的依赖,只需要引入基本的依赖就可以使用定时任务。

	<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency> </dependencies>

启动类配置

在启动类中需要加入@EnableScheduling注解,意思是开启定时任务。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling; /**
* Author: YaoQi
* Date: 2018/9/28 21:37
* Description: springBoot schedule
*/
@SpringBootApplication
@EnableScheduling
public class ScheduleApp { public static void main(String[] args) {
SpringApplication.run(ScheduleApp.class, args);
}
}

定时任务Demo

写一个定时任务demo,每秒种打印一次日志,并打印当前时间验证当前任务执行周期。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service; /**
* Author: YaoQi
* Date: 2018/9/28 21:40
* Description: Scheduled Task
*/
@Service
public class ScheduleTask { private static final Logger logger = LoggerFactory.getLogger(ScheduleTask.class); @Scheduled(cron = "*/1 * * * * ?")
public void execute() {
logger.info("print word.");
logger.info(String.valueOf(System.currentTimeMillis()));
}
}

运行结果:

示例分析

从上图的结果中看:该任务基本是每秒种执行一次,如果不手动停止,程序会一直执行下去,并且从日志中看,这个任务的执行周期是1s左右,刚好和设置的cron表达式一致;并且执行这个任务的线程一直是poll-1-thread-1这个线程。这就意味着,这个定时任务启动是由单独的一个线程去执行的。

这时候,可能会有几个问题:

如果任务执行的时间比执行周期要短,这个任务会怎么执行?

如果有多个任务执行,还会是一个线程去执行这个任务吗?

首先验证第一个问题,当任务执行的时间比执行周期短时,任务的执行情况。

@Scheduled(cron = "*/1 * * * * ?")
public void execute() {
logger.info("print word.");
logger.info(String.valueOf(System.currentTimeMillis()));
try {
Thread.sleep(6000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

执行结果:每次任务的执行时间间隔为7秒,并且是同一个线程在执行。

如果有多个任务执行,任务的执行情况。

@Scheduled(cron = "*/1 * * * * ?")
public void execute() {
logger.info("print word.");
try {
Thread.sleep(6000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
} @Scheduled(cron = "*/1 * * * * ?")
public void execute1() {
logger.info(String.valueOf(System.currentTimeMillis()));
logger.info("write message.");
}

执行结果:

执行结果:第二个每秒执行一次的任务的并没有安装设定的执行周期执行,运行结果并没有达到预期。并且两个任务都是由同一个线程去运行。

多任务模式

示例分析中问题2的原因就是执行多个任务并不是多个线程执行,导致执行第一个任务时,第二个任务进入等待状态。springBoot中提供了多线程运行定时任务的方式。

@Configuration
public class ScheduleConfig implements SchedulingConfigurer { @Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(3));
}
}

增加一个配置类,设置线程池,并设置线程池大小,这里的线程池大小就仁者见仁了,和你程序中的任务的个数有关系,也和机器的核数有关系。

通过配置线程池就能让每个任务独立执行,不受其他任务的影响,因为是在不同的线程中执行的,但如果涉及到公共资源就另当别论了。

执行结果:

配置执行周期

上述中的执行周期都是以cron表达式定义的,这种方式最灵活,但是上文中的表达式都写到代码中去了,不便于修改,这里提供一种配置方式,直接用表达式获取yml中的配置信息。

scheduleTask:
cron1: "*/1 * * * * ?"
cron2: "*/1 * * * * ?"

在yml中添加cron的配置信息。然后在Java注解中可以直接获取。

@Scheduled(cron = "${scheduleTask.cron2}")
public void execute1() {
logger.info(String.valueOf(System.currentTimeMillis()));
logger.info("write message.");
}

springBoot中使用定时任务的更多相关文章

  1. springBoot中的定时任务

    springBoot中的定时任务 1:在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置 2:新建ScheduledTasks任务类 : package c ...

  2. SpringBoot中执行定时任务

    一:在SpringBoot中使用定时任务相当的简单.首先,我们在启动类中加入@EnableScheduling来开启定时任务. @SpringBootApplication @EnableSchedu ...

  3. 在SpringBoot中配置定时任务

    前言 之前在spring中使用过定时任务,使用注解的方式配置很方便,在SpringBoot中的配置基本相同,只是原来在spring中的xml文件的一些配置需要改变,在SpringBoot中也非常简单. ...

  4. SpringBoot中的定时任务与Quartz的整合

    SpringBoot集成Quartz 定时任务Quartz : 就是在指定的时间执行一次或者循环执行,在项目的开发中有时候会需要的, 还是很有用的. SpringBoot内置的定时 添加依赖 < ...

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

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10659045.html,否则将追究法律责任!!! 一.在JAVA开发领域,目前可以通过以下 ...

  6. SpringBoot几种定时任务的实现方式

    定时任务实现的几种方式: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行, ...

  7. 转:java中的定时任务

    引自:http://www.cnblogs.com/wenbronk/p/6433178.html java中的定时任务, 使用java实现有3种方式: 1, 使用普通thread实现 @Test p ...

  8. 定时任务-----Springboot中使用Scheduled做定时任务----http://www.cnblogs.com/lirenqing/p/6596557.html

    Springboot中使用Scheduled做定时任务---http://www.cnblogs.com/lirenqing/p/6596557.html 已经验证的方案: pom文件加入依赖 < ...

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

    SpringBoot中使用@Scheduled创建定时任务 定时任务一般会在很多项目中都会用到,我们往往会间隔性的的去完成某些特定任务来减少服务器和数据库的压力.比较常见的就是金融服务系统推送回调,一 ...

随机推荐

  1. JAVA开发知识之Java的线程

    目录 Java多线程讲解 一丶多线程简介 1.进程的概念 2.线程概念 3.Java中多线程Thread类 二丶多线程的创建 1.继承Thread类.重写run方法. 2.实现Runalbe接口. 三 ...

  2. javascript基础修炼(8)——指向FP世界的箭头函数

    一. 箭头函数 箭头函数是ES6语法中加入的新特性,而它也是许多开发者对ES6仅有的了解,每当面试里被问到关于"ES6里添加了哪些新特性?"这种问题的时候,几乎总是会拿箭头函数来应 ...

  3. C#单例模式的几种实现方式

     一.多线程不安全方式实现 public sealed class SingleInstance { private static SingleInstance instance; private S ...

  4. Linux-Kconfig总结与分析

    使用Kconfig时,需要注意的地方 1.在Kconfig中定义的配置宏,前缀都没有"CONFIG_",只有编译内核时,自动生成autoconf.h才会出现前缀. 2.如果XX_d ...

  5. 微信公众号页面的web页面键盘弹起问题

    今天开发的过程中,遇到了一个小问题,是这样的,  UI的设计稿中有个底部的按钮是相对于屏幕定位的,但是这个页面还有一个输入框:具体情况请看下图: 这就造成了当我们输入框获取焦点的时候,键盘弹起,下面的 ...

  6. jsp内置对象的作用范围

    内置对象的作用范围是指每个内置对象的某个实例在多长时间和多大的范围中有效,即在什么样的范围内可以有效地访问同一个对象实例. 在javax.servlet.jsp.PageContext的类中定义了4个 ...

  7. 20, CSS 定义选择器

    1. ID 与类 2. 层叠 3. 分组 4. 继承 5. 上下文选择器 6. 子类选择器 7. 其他选择器 8. 结构与注释 20.1 ID 与类 选择器是用于控制页面设计的样式.即 ID 选择器何 ...

  8. Android 技能图谱学习路线

    这里是在网上找到的一片Android学习路线,希望记录下来供以后学习 1Java 基础 Java Object类方法 HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理 HashMap ...

  9. C++ 11 Lambda表达式

    C++11的一大亮点就是引入了Lambda表达式.利用Lambda表达式,可以方便的定义和创建匿名函数.对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多 ...

  10. UE4分支的Git Flow

    UE4作为开源商业引擎,其代码托管在私有库:https://github.com/EpicGames/UnrealEngine 为了能看到并下载UE4的代码,开发者需要有GitHub账号和Unreal ...