成都筑巢网站建设,中卫网站推广外包服务,建设银行临江支行网站,购物商城网站源码玩转SpringBoot之定时任务详解 https://www.cnblogs.com/mmzs/p/10161936.html 玩转SpringBoot之定时任务详解 阅读目录#xff1a;
序言一、静态#xff1a;基于注解二、动态#xff1a;基于接口三、多线程定时任务阅读正文#xff1a;
回到顶部
序言
使用SpringBoot创…
玩转SpringBoot之定时任务详解 https://www.cnblogs.com/mmzs/p/10161936.html 玩转SpringBoot之定时任务详解 阅读目录
序言一、静态基于注解二、动态基于接口三、多线程定时任务阅读正文
回到顶部
序言
使用SpringBoot创建定时任务非常简单目前主要有以下三种创建方式
一、基于注解(Scheduled)二、基于接口SchedulingConfigurer 前者相信大家都很熟悉但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务这时候基于接口的定时任务就派上用场了。三、基于注解设定多线程定时任务
回到顶部
一、静态基于注解
基于注解Scheduled默认为单线程开启多个任务时任务的执行时机会受上一个任务执行时间的影响。
1、创建定时器
使用SpringBoot基于注解来创建定时任务非常简单只需几行代码便可完成。 代码如下 Configuration //1.主要用于标记配置类兼备Component的效果。
EnableScheduling // 2.开启定时任务
public class SaticScheduleTask {//3.添加定时任务Scheduled(cron 0/5 * * * * ?)//或直接指定时间间隔例如5秒//Scheduled(fixedRate5000)private void configureTasks() {System.err.println(执行静态定时任务时间: LocalDateTime.now());}
} Cron表达式参数分别表示
秒0~59 例如0/5表示每5秒分0~59时0~23日0~31的某天需计算月0~11周几 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT
Scheduled除了支持灵活的参数表达式cron之外还支持简单的延时操作例如 fixedDelay fixedRate 填写相应的毫秒数即可。 2、启动测试
启动应用可以看到控制台打印出如下信息 显然使用Scheduled 注解很方便但缺点是当我们调整了执行周期的时候需要重启应用才能生效这多少有些不方便。为了达到实时生效的效果可以使用接口来完成定时任务。 回到顶部
二、动态基于接口
基于接口SchedulingConfigurer
1、导入依赖包 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdversion2.0.4.RELEASE/version/parentdependenciesdependency!--添加Web依赖 --groupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependency!--添加MySql依赖 --groupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/dependencydependency!--添加Mybatis依赖 配置mybatis的一些初始化的东西--groupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion1.3.1/version/dependencydependency!-- 添加mybatis依赖 --groupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.4.5/versionscopecompile/scope/dependency/dependencies 2、添加数据库记录
开启本地数据库mysql随便打开查询窗口然后执行脚本内容如下 DROP DATABASE IF EXISTS socks;
CREATE DATABASE socks;
USE SOCKS;
DROP TABLE IF EXISTS cron;
CREATE TABLE cron (cron_id varchar(30) NOT NULL PRIMARY KEY,cron varchar(30) NOT NULL
);
INSERT INTO cron VALUES (1, 0/5 * * * * ?); 然后在项目中的application.yml 添加数据源
spring:datasource:url: jdbc:mysql://localhost:3306/socksusername: rootpassword: 123456 3、创建定时器
数据库准备好数据之后我们编写定时任务注意这里添加的是TriggerTask目的是循环读取我们在数据库设置好的执行周期以及执行相关定时任务的内容。 具体代码如下 Configuration //1.主要用于标记配置类兼备Component的效果。
EnableScheduling // 2.开启定时任务
public class DynamicScheduleTask implements SchedulingConfigurer {Mapperpublic interface CronMapper {Select(select cron from cron limit 1)public String getCron();}Autowired //注入mapperSuppressWarnings(all)CronMapper cronMapper;/*** 执行定时任务.*/Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.addTriggerTask(//1.添加任务内容(Runnable)() - System.out.println(执行动态定时任务: LocalDateTime.now().toLocalTime()),//2.设置执行周期(Trigger)triggerContext - {//2.1 从数据库获取执行周期String cron cronMapper.getCron();//2.2 合法性校验.if (StringUtils.isEmpty(cron)) {// Omitted Code ..}//2.3 返回执行周期(Date)return new CronTrigger(cron).nextExecutionTime(triggerContext);});}} 4、启动测试
启动应用后查看控制台打印时间是我们预期的每10秒一次
然后打开Navicat 将执行周期修改为每6秒执行一次如图
查看控制台发现执行周期已经改变并且不需要我们重启应用十分方便。如图
注意 如果在数据库修改时格式出现错误则定时任务会停止即使重新修改正确此时只能重新启动项目才能恢复。 回到顶部
三、多线程定时任务
基于注解设定多线程定时任务
1、创建多线程定时任务 //Component注解用于对那些比较中立的类进行注释
//相对与在持久层、业务层和控制层分别采用 Repository、Service 和 Controller 对分层中的类进行注释
Component
EnableScheduling // 1.开启定时任务
EnableAsync // 2.开启多线程
public class MultithreadScheduleTask {AsyncScheduled(fixedDelay 1000) //间隔1秒public void first() throws InterruptedException {System.out.println(第一个定时任务开始 : LocalDateTime.now().toLocalTime() \r\n线程 : Thread.currentThread().getName());System.out.println();Thread.sleep(1000 * 10);}AsyncScheduled(fixedDelay 2000)public void second() {System.out.println(第二个定时任务开始 : LocalDateTime.now().toLocalTime() \r\n线程 : Thread.currentThread().getName());System.out.println();}} 注 这里的Async注解很关键 2、启动测试
启动应用后查看控制台
从控制台可以看出第一个定时任务和第二个定时任务互不影响
并且由于开启了多线程第一个任务的执行时间也不受其本身执行时间的限制所以需要注意可能会出现重复操作导致数据异常。 代码地址https://github.com/mmzsblog/springboot-schedule 原文链接https://www.mmzsblog.cn/articles/2019/08/08/1565247960802.html