Spring定时任务--手动执行定时任务(替代@Scheduled)

原文网址:Spring定时任务--手动执行定时任务(替代@Scheduled)

简介

本文介绍SpringBoot如何手动执行定时任务。

之前此文已经介绍过,直接用@Scheduled即可使用Spring的定时任务,但有时需要手动去提交定时任务,比如:

  1. 从其他位置获取cron配置,无法写到注解。
  2. 有不确定个数的任务,不能在代码中写死。

方案1:实现 SchedulingConfigurer 接口

本处从数据库读取配置,然后提交定时任务。

创建定时器

编写定时任务,这里添加的是TriggerTask,循环读取我们在数据库设置好的执行周期,以及执行相关定时任务的内容。

@Configuration
@EnableScheduling
public class DynamicScheduleTask implements SchedulingConfigurer {@Autowiredprivate 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);});}}

表结构与数据

开启本地数据库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

启动测试

启动应用后,查看控制台,打印时间是我们预期的每10秒一次:

打开Navicat ,将执行周期修改为每6秒执行一次,如图

如果在数据库修改时格式出现错误,则定时任务会停止,即使重新修改正确;此时只能重新启动项目才能恢复。

方案2:ThreadPoolTaskScheduler

上边的实例的定时任务在SprinBoot在启动时就启动,也可以在代码中任意启动/关闭/调整时间。如下:

package com.example.demo.task;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Date;
import java.util.concurrent.ScheduledFuture;@RestController
@Component
public class TestScheduler {@Autowiredprivate ThreadPoolTaskScheduler threadPoolTaskScheduler;private ScheduledFuture<?> future;@Beanpublic ThreadPoolTaskScheduler threadPoolTaskScheduler() {return new ThreadPoolTaskScheduler();}@RequestMapping("/startCron")public String startCron() {future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("0/5 * * * * *"));System.out.println("DynamicTask.startCron()");return "startCron";}@RequestMapping("/stopCron")public String stopCron() {if (future != null) {future.cancel(true);}System.out.println("DynamicTask.stopCron()");return "stopCron";}@RequestMapping("/changeCron10")public String startCron10() {stopCron();// 先停止,在开启.future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("*/10 * * * * *"));System.out.println("DynamicTask.startCron10()");return "changeCron10";}private class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println("DynamicTask.MyRunnable.run()," + new Date());}}
}

浏览器分别输入:http://localhost:8080/startCron、http://localhost:8080/stopCron 

执行结果

  .   ____          _            __ _ _/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/  ___)| |_)| | | | | || (_| |  ) ) ) )'  |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot ::        (v2.3.0.RELEASE)2020-05-27 19:48:02.370  INFO 6804 --- [           main] com.example.demo.DemoApplication         : Starting DemoApplication on liu-PC with PID 6804 (E:\work\idea_proj\test-SpringBoot\target\classes started by liu in E:\work\idea_proj\test-SpringBoot)
2020-05-27 19:48:02.373  INFO 6804 --- [           main] com.example.demo.DemoApplication         : No active profile set, falling back to default profiles: default
2020-05-27 19:48:03.675  INFO 6804 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2020-05-27 19:48:03.684  INFO 6804 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-05-27 19:48:03.684  INFO 6804 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.35]
2020-05-27 19:48:03.941  INFO 6804 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-05-27 19:48:03.941  INFO 6804 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1523 ms
2020-05-27 19:48:04.001  INFO 6804 --- [           main] o.s.s.c.ThreadPoolTaskScheduler          : Initializing ExecutorService 'threadPoolTaskScheduler'
2020-05-27 19:48:04.405  INFO 6804 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2020-05-27 19:48:04.419  INFO 6804 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 3.328 seconds (JVM running for 8.111)
2020-05-27 19:48:39.380  INFO 6804 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-05-27 19:48:39.380  INFO 6804 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2020-05-27 19:48:39.405  INFO 6804 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 25 ms
DynamicTask.startCron()
DynamicTask.MyRunnable.run(),Wed May 27 19:48:50 CST 2020
DynamicTask.MyRunnable.run(),Wed May 27 19:48:55 CST 2020
DynamicTask.MyRunnable.run(),Wed May 27 19:49:00 CST 2020
DynamicTask.MyRunnable.run(),Wed May 27 19:49:05 CST 2020
DynamicTask.MyRunnable.run(),Wed May 27 19:49:10 CST 2020
DynamicTask.stopCron()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/491591.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于相位的运动放大:如何检测和放大难以察觉的运动(01/2)

基于相位的运动放大&#xff1a;如何检测和放大难以察觉的运动 目录 一、说明二、结果的峰值三、金字塔背景3.1 可操纵金字塔3.2 亚倍频程复数可控金字塔 四、基本方针4.1 1D 问题陈述4.2 一维方法4.3 实际实施说明 五、放大倍率的限制5.1 空间支持的影响5.2 频带的影响 六、推…

苹果 CMS 大橙子 vfed 5.0优化版

大橙子模版算是在苹果 CMS 众多主题里&#xff0c;较为亮眼的一款了&#xff0c;主题简洁&#xff0c;功能众多&#xff0c;非常的齐全。 今天分享的就是大橙 5.0 版本模板&#xff0c;完美破解&#xff0c;自测无后门&#xff0c;无广告不影响任何功能体验性。下载地址&#…

【mediasoup】v3的 probation 关键字

probatorprobation基于mediaoup v3分支 probation 是探测么? 3.11.22 libwebrtc: Fix bandwidth probation dead state (PR #1031 by @vpalmisano).Running some tests with high packet loss (~20%), in most cases the server stops sending any video packet and we never …

leetcode-hot100-双指针

剪枝&#xff0c;减少不必要的计算 283. 移动零 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0] 输出: [0] 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 第一印象&#xff1a;使用一个辅助数组&#xff0c;同时以…

python常用文件操作

1.文件夹创建&#xff0c;删除&#xff0c;重命名&#xff0c;路径连接&#xff0c;文件打开&#xff0c;关闭读写 #文件夹创建 path ./test newpath "./new" #判断文件夹是否存在 ret os.path.exists(path) if ret:pass else:#创建文件夹os.mkdir(path)#文件夹重…

【数据结构】时间复杂度与空间复杂度

目录 时间复杂度 空间复杂度 时间复杂度 算法的时间复杂度并不是指一个代码运行时间的快慢&#xff0c;因为在不同机器上运行的时间肯定不同&#xff0c;因此算法的时间复杂度指的是基本操作的执行次数&#xff0c;他是一个数学意义上的函数。这个函数并不是C语言中那种函数&…

unity发布webGL压缩方式的gzip,使用nginx作为web服务器时的配置文件

unity发布webGL压缩方式的gzip&#xff0c;使用nginx作为web服务器时的配置文件 Unity版本是&#xff1a;2021.3 nginx的版本是&#xff1a;nginx-1.25.4 Unity发布webgl时的测试 设置压缩方式是gzip nginx配置文件 worker_processes 1;events {worker_connections 102…

网站开发--详解Servlet

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网站开发–详解Servlet 一.基本介绍 tomcat是Java中开发服务器的重要的一个工具,任何开发的服务器都要部署在tomcat之上,可以说tomcat是所有服务器的底座,为了更好的操作http,to…

探索水下低光照图像检测性能,基于YOLOv6全系列【n/s/m/l】参数模型开发构建海底生物检测识别分析系统

底这类特殊数据场景下的检测模型开发相对来说比较少&#xff0c;在前面的博文中也有一些涉及&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 试探索水下目标检测&#xff0c;基于yolov5轻量级系列模型n/s/m开发构建海底生物检测系统》 《基于YOLOv5C3CBAMCBAM注意力…

EasyRecovery2024个人免费版本电脑手机数据恢复软件下载

EasyRecovery是一款功能强大的数据恢复软件&#xff0c;能够帮助用户恢复丢失、删除、格式化或损坏的数据。无论是由于误操作、病毒攻击、硬盘故障还是其他原因导致的数据丢失&#xff0c;EasyRecovery都能提供有效的解决方案。 该软件支持从各种存储介质恢复数据&#xff0c;…

OD(11)之Mermaid时间线图(Timeline diagram)使用详解

OD(11)之Mermaid时间线图(Timeline diagram)使用详解 Author: Once Day Date: 2024年2月25日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermiad使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and char…

10 款数据恢复软件功能和有效性对比(2024 年更新)

数据丢失可能是一种痛苦的经历&#xff0c;无论是由于意外删除、硬件故障还是软件损坏。值得庆幸的是&#xff0c;数字时代带来了强大的数据恢复解决方案。 随着我们进入 2024 年&#xff0c;市场上充斥着旨在有效检索丢失数据的先进软件。在本文中&#xff0c;我们将探讨 2024…