为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

定时任务Spring-Boot-定时执行任务详解,每天定时几点钟执行任务

2023-06-24 5页 doc 186KB 11阅读

用户头像 个人认证

is_859878

暂无简介

举报
定时任务Spring-Boot-定时执行任务详解,每天定时几点钟执行任务  【定时任务】SpringBoot定时执行任务详解,每天定时几点钟执行任务  目录一、静态:基于注解二、动态:基于接口三、多线程定时任务序言:使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式:一、基于注解(@Scheduled)二、基于接口(SchedulingConfigurer)前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了。三、基于注解设定多线程定时任务一、静态:基于注解基于注解@Scheduled默认为单线程,开启多...
定时任务Spring-Boot-定时执行任务详解,每天定时几点钟执行任务
  【定时任务】SpringBoot定时执行任务详解,每天定时几点钟执行任务  一、静态:基于注解二、动态:基于接口三、多线程定时任务序言:使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式:一、基于注解(@Scheduled)二、基于接口(SchedulingConfigurer)前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了。三、基于注解设定多线程定时任务一、静态:基于注解基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响。1、创建定时器使用SpringBoot基于注解来创建定时任务非常简单,只需几行代码便可完成。 代码如下:@Configuration//1.主要用于标记配置类,兼备Component的效果。@EnableScheduling//2.开启定时任务publicclassSaticScheduleTask{//3.添加定时任务@Scheduled(cron="0/5****?")//或直接指定时间间隔,例如:5秒//@Scheduled(fixedRate=5000)privatevoidconfigureTasks(){System.err.println("执行静态定时任务时间:"+LocalDateTime.now());}}Cron达式参数分别表示:(Cron具体意思和用法请看这篇文章:https://blog.csdn.net/u013987258/article/details/106690859)秒(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、导入依赖包:org.springframework.bootspring-boot-starter2.0.4.RELEASEorg.springframework.bootspring-boot-starter-webmysqlmysql-connector-javaorg.mybatis.spring.bootmybatis-spring-boot-starter1.3.1org.mybatismybatis3.4.5compile2、添加数据库记录:开启本地数据库mysql,随便打开查询窗口,然后执行脚本内容,如下:DROPDATABASEIFEXISTS`socks`;CREATEDATABASE`socks`;USE`SOCKS`;DROPTABLEIFEXISTS`cron`;CREATETABLE`cron`(`cron_id`varchar(30)NOTNULLPRIMARYKEY,`cron`varchar(30)NOTNULL);INSERTINTO`cron`VALUES('1','0/5****?');然后在项目中的application.yml添加数据源:spring:datasource:url:jdbc:mysql://localhost:3306/socksusername:rootpassword:1234563、创建定时器数据库准备好数据之后,我们编写定时任务,注意这里添加的是TriggerTask,目的是循环读取我们在数据库设置好的执行周期,以及执行相关定时任务的内容。具体代码如下:@Configuration//1.主要用于标记配置类,兼备Component的效果。@EnableScheduling//2.开启定时任务publicclassDynamicScheduleTaskimplementsSchedulingConfigurer{@MapperpublicinterfaceCronMapper{@Select("selectcronfromcronlimit1")publicStringgetCron();}@Autowired//注入mapper@SuppressWarnings("all")CronMappercronMapper;/***执行定时任务.*/@OverridepublicvoidconfigureTasks(ScheduledTaskRegistrartaskRegistrar){taskRegistrar.addTriggerTask(//1.添加任务内容(Runnable)()->System.out.println("执行动态定时任务:"+LocalDateTime.now().toLocalTime()),//2.设置执行周期(Trigger)triggerContext->{//2.1从数据库获取执行周期Stringcron=cronMapper.getCron();//2.2合法性校验.if(StringUtils.isEmpty(cron)){//OmittedCode..}//2.3返回执行周期(Date)returnnewCronTrigger(cron).nextExecutionTime(triggerContext);});}}4、启动测试启动应用后,查看控制台,打印时间是我们预期的每10秒一次:然后打开Navicat,将执行周期修改为每6秒执行一次,如图:查看控制台,发现执行周期已经改变,并且不需要我们重启应用,十分方便。如图:注意: 如果在数据库修改时格式出现错误,则定时任务会停止,即使重新修改正确;此时只能重新启动项目才能恢复。三、多线程定时任务基于注解设定多线程定时任务1、创建多线程定时任务//@Component注解用于对那些比较中立的类进行注释;//相对与在持久层、业务层和控制层分别采用@Repository、@Service和@Controller对分层中的类进行注释@Component@EnableScheduling//1.开启定时任务@EnableAsync//2.开启多线程publicclassMultithreadScheduleTask{@Async@Scheduled(fixedDelay=1000)//间隔1秒publicvoidfirst()throwsInterruptedException{System.out.println("第一个定时任务开始:"+LocalDateTime.now().toLocalTime()+"\r\n线程:"+Thread.currentThread().getName());System.out.println();Thread.sleep(1000*10);}@Async@Scheduled(fixedDelay=2000)publicvoidsecond(){System.out.println("第二个定时任务开始:"+LocalDateTime.now().toLocalTime()+"\r\n线程:"+Thread.currentThread().getName());System.out.println();}}注:这里的@Async注解很关键2、启动测试启动应用后,查看控制台:从控制台可以看出,第一个定时任务和第二个定时任务互不影响;并且,由于开启了多线程,第一个任务的执行时间也不受其本身执行时间的限制,所以需要注意可能会出现重复操作导致数据异常。  -全文完-
/
本文档为【定时任务Spring-Boot-定时执行任务详解,每天定时几点钟执行任务】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索