-
spring定时任务详解(@Scheduled注解)
2016-07-07 17:09:36在springMVC里使用spring的定时任务非常的简单,如下: (一)在xml里加入task的命名空间 xmlns:task="http://www.springframework.org/schema/task" ...在springMVC里使用spring的定时任务非常的简单,如下:
(一)在xml里加入task的命名空间
xmlns:task="http://www.springframework.org/schema/task" http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd
(二)启用注解驱动的定时任务
<task:annotation-driven scheduler="myScheduler"/>
(三)配置定时任务的线程池
推荐配置线程池,若不配置多任务下会有问题。后面会详细说明单线程的问题。
<task:scheduler id="myScheduler" pool-size="5"/>
(四)写我们的定时任务
@Scheduled注解为定时任务,cron表达式里写执行的时机
package com.mvc.task.impl; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.concurrent.TimeUnit; import org.joda.time.DateTime; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.mvc.task.IATask; @Component public class ATask implements IATask{ @Scheduled(cron="0/10 * * * * ? ") //每10秒执行一次 @Override public void aTask(){ try { TimeUnit.SECONDS.sleep(20); } catch (InterruptedException e) { e.printStackTrace(); } DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(DateTime.now().toDate())+"*********A任务每10秒执行一次进入测试"); } }
package com.mvc.task.impl; import java.text.DateFormat; import java.text.SimpleDateFormat; import org.joda.time.DateTime; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.mvc.task.IBTask; @Component public class BTask implements IBTask{ @Scheduled(cron="0/5 * * * * ? ") //每5秒执行一次 @Override public void bTask(){ DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sdf.format(DateTime.now().toDate())+"*********B任务每5秒执行一次进入测试"); } }
spring的定时任务默认是单线程,多个任务执行起来时间会有问题(B任务会因为A任务执行起来需要20S而被延后20S执行),如下图所示:
当我们配置了线程池后再来看结果(多线程下,B任务再也不会因为A任务执行起来要20S而被延后了):cron表达式详解:
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。
按顺序依次为
1 秒(0~59)
2 分钟(0~59)
3 小时(0~23)
4 天(0~31)
5 月(0~11)
6 星期(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
7.年份(1970-2099)
其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?.
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
有些子表达式能包含一些范围或列表
例如:子表达式(天(星期))可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”
“*”字符代表所有可能的值
“/”字符用来指定数值的增量
例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟
在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样
“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值
当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
“L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写
如果在“L”前有具体的内容,它就具有其他的含义了。例如:“6L”表示这个月的倒数第6天
注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题
W 字符代表着平日(Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日。大部分的商业处理都是基于工作周的,所以 W 字符可能是非常重要的。
例如,日域中的 15W 意味着 "离该月15号的最近一个平日。" 假如15号是星期六,那么 trigger 会在14号(星期五)触发,因为星期四比星期一离15号更近。
C:代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * / -
基于Springboot执行多个定时任务并且动态获取定时任务信息
2018-08-30 14:37:09基于Springboot执行多个定时任务并且动态获取定时任务信息 基于Springboot执行多个定时任务并且动态获取定时任务信息 简介 说明 SpringApplication-启动类 动态获取定时任务信息 mapper service service impl ...基于Springboot执行多个定时任务并且动态获取定时任务信息
文章目录
说明
- 多计划任务并发问题
- 自动刷新问题
- 数据库变更后怎么立即生效
- 以上问题看最新的博文SpringBoot实现多线程并发动态执行计划任务
简介
因为一些业务的需要所有需要使用多个不同的定时任务,并且每个定时任务中的定时信息是通过数据库动态获取的。下面是我写的使用了Springboot+Mybatis写的多任务定时器。
主要实现了以下功能:1.同时使用多个定时任务 2.动态获取定时任务的定时信息
说明
因为我们需要从数据库动态的获取定时任务的信息,所以我们需要集成 SchedulingConfigurer 然后重写 configureTasks 方法即可,调用不同的定时任务只需要通过service方法调用不用的实现返回对应的定时任务信息。有多少个定时任务就重写多少个该方法(最好创建不同的类)。然后直接在application中启动即可。
SpringApplication-启动类
package test; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.transaction.annotation.EnableTransactionManagement; @SpringBootApplication @EnableTransactionManagement @EnableScheduling @ComponentScan(value = {"test.*"}) @MapperScan("test.mapper.*") public class TomcatlogApplication { public static void main(String[] args) { SpringApplication.run(TomcatlogApplication.class, args); } }
动态获取定时任务信息
mapper
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; /* * @version 1.0 created by liuxuewen on 2018/8/21 14:39 */ public interface TomcatlogMapper { @Select("SELECT * FROM scheduledtask s WHERE s.`enable` = 1") List<ScheduledtaskEntity> queryScheduledTask(); }
service
package test.service; import java.util.ArrayList; import java.util.List; /* * @version 1.0 created by liuxuewen on 2018/8/21 14:44 */ public interface TomcatlogService { List<ScheduledtaskEntity> queryScheduledTask(); }
service impl
import test.mapper.tomcatlog.TomcatlogMapper; import test.service.TomcatlogService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /* * @version 1.0 created by liuxuewen on 2018/8/21 14:44 */ @Service public class TomcatlogServiceImpl implements TomcatlogService { private static final Logger LOGGER = LoggerFactory.getLogger(TomcatlogServiceImpl.class); @Autowired TomcatlogMapper tomcatlogMapper; @Override public List<ScheduledtaskEntity> queryScheduledTask() { try { List<ScheduledtaskEntity> res = tomcatlogMapper.queryScheduledTask(); return res; } catch (Exception e) { LOGGER.info(e); } return null; }
定时任务
import test.service.TomcatlogService ; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; /* * @version 1.0 created by liuxuewen on 2018/8/27 9:25 */ @Component public class ElasticsearchSchedultaskController implements SchedulingConfigurer { private static final Logger LOGGER = LoggerFactory.getLogger(ElasticsearchSchedultaskController.class); @Autowired private TomcatlogService controllerService; @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { try { controllerService.queryScheduledTask().forEach((cron)->{ scheduledTaskRegistrar.addTriggerTask( //1.添加任务内容(Runnable),可以为方法 () -> System.out.println("定时任务1"), //2.设置执行周期(Trigger) triggerContext -> { //2.1 从数据库获取执行周期,在这里调用不同的方法返回不同的定时任务信息 System.out.println(cron); //2.2 合法性校验. if (StringUtils.isEmpty(cron)) { // Omitted Code .. LOGGER.error("计划任务为空"); } //2.3 返回执行周期(Date) return new CronTrigger(cron).nextExecutionTime(triggerContext); } ); }); }catch (Exception e){ LOGGER.info(e.toString()); } } }
-
【SpringBoot】十九、SpringBoot中实现启动任务
2020-06-14 21:35:16我们在项目中会用到项目启动任务,即项目在启动的时候需要做的一些事,例如:数据初始化、获取第三方数据等等,那么如何在SpringBoot 中实现启动任务,一起来看看吧 SpringBoot 中提供了两种项目启动方案,...我们在项目中会用到项目启动任务,即项目在启动的时候需要做的一些事,例如:数据初始化、获取第三方数据等等,那么如何在SpringBoot 中实现启动任务,一起来看看吧
SpringBoot 中提供了两种项目启动方案,CommandLineRunner 和 ApplicationRunner
一、CommandLineRunner
使用 CommandLineRunner ,需要自定义一个类区实现 CommandLineRunner 接口,例如:
import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; /** * 项目启动任务类 */ @Component @Order(100) public class StartTask implements CommandLineRunner { @Override public void run(String... args) throws Exception { } }
我们首先使用 @Component 将该类注册成为 Spring 容器中的一个 Bean
然后使用 @Order(100) 标明该启动任务的优先级,值越大,表示优先级越小
实现 CommandLineRunner 接口,并重写 run() 方法,当项目启动时,run() 方法会被执行,run() 方法中的参数有两种传递方式
1、在 IDEA 中传入参数
2、将项目打包,在启动项目时,输入以下命令:java -jar demo-0.0.1-SNAPSHOT.jar hello world
二、ApplicationRunner
ApplicationRunner 与 CommandLineRunner 的用法基本一致,只是接收的参数不一样,可以接收 key-value 形式的参数,如下:
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; /** * 项目启动任务类 */ @Component @Order(100) public class StartTask implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { } }
关于 run 方法的参数 ApplicationArguments:
1、args.getNonOptionArgs();可以用来获取命令行中的无key参数(和CommandLineRunner一样)
2、args.getOptionNames();可以用来获取所有key/value形式的参数的key
3、args.getOptionValues(key));可以根据key获取key/value 形式的参数的value
4、args.getSourceArgs(); 则表示获取命令行中的所有参数传参方式:
1、在 IDEA 中传入参数
2、将项目打包,在启动项目时,输入以下命令:java -jar demo-0.0.1-SNAPSHOT.jar hello world --name=xiaoming
以上就是在 SpringBoot 中实现项目启动任务的两种方式,用法基本一致,主要体现在传参的不同上
如您在阅读中发现不足,欢迎留言!!!
-
Windows7执行Python定时任务
2019-12-04 20:21:15注:Windows10类似,可添加任何你想做的事。 大致步骤: 1.开始-->搜索程序和文件-->计划任务 2.进入任务计划程序-->点击创建任务 3.在创建任务界面填写相关信息(示例): 4.OK。 ...注:Windows10类似,可添加任何你想做的事。
大致步骤:
1.开始-->搜索程序和文件-->计划任务
2.进入任务计划程序-->点击创建任务
3.在创建任务界面填写相关信息(示例):
4.OK。
-
crontab定时任务不执行的原因
2017-01-16 18:35:20我在网上找的时候发现网上主要...如果停止了就无法执行任何定时任务了,解决的方法是打开它: crond 或 service crond start 如果提示crond命令不存在,可能被误删除了,CentOS下可以通过这个命令重新安装: yum... -
azkaban 提交任务不执行直接失败
2020-12-01 17:54:56azkaban 提交任务不执行直接失败 azkaban web 报错 ERROR [FlowTriggerScheduler] [Azkaban] Unable to get scheduled flow triggers 查看web下log cat webServerLog_2020-11-27+18\:11\:24.out 报错信息 2020/11/... -
流程引擎动态任务实现(收发文流程案例)
2020-06-22 17:27:03收发文流程实现,以及流程引擎中动态增加节点|临时子流程的使用。流程引擎动态任务实现。 -
Springboot整合定时任务和异步任务处理
2020-02-28 00:19:31使用Springboot整合的定时任务和异步任务处理 -
同步任务、异步任务、宏任务、微任务基本概念
2018-11-13 15:37:53**同步任务:**指的是在主线程傻姑娘排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。 **异步任务:**指的是不进入主线程,某个异步任务可以执行了,该任务才会进入主线程执行。 异步执行的运行机制... -
Linux执行定时任务步骤(crontab)
2019-12-04 20:50:382.查看当前用户所有定时任务:crontab -l 3.进入定时任务编辑界面,终端输入指令:crontab -e 4.开始编辑,例如添加一个每分钟定时输出hello到test.txt文件的定时任务: 5.* * * * * 分别代表 分 时 日 月 周 .... -
SpringBoot 动态可配定时任务可实现不重启管理任务(动态定时任务)
2018-12-23 23:21:481.1创建任务表 CREATE TABLE `scheduled_task` ( `id` int(11) NOT NULL AUTO_INCREMENT, `task_key` varchar(128) NOT NULL COMMENT '任务key值(使用bean名称)', `task_desc` varchar(128) DEFAULT NULL ... -
vue 任务队列和异步更新策略 (清晰理解任务队列、微任务、宏任务)
2020-06-30 12:03:11事件循环 JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。为了协调事件、用户交互、脚本、UI 渲染和网络处理等行为,防止主线程的不阻塞,Event Loop 的方案应用而生。...任务队列 -
springboot 定时任务 实现SchedulingConfigurer接口,修改定时任务不重启项目
2020-08-28 11:19:30定时任务的任务名称,cron(定时任务表达式),定时任务开关,存储在数据库表中。在不重启项目的情况下,修改定时任务表达式,可以实时获取新的定时任务执行时间规则;修改定时任务执行状态,可以随时开关定时任务。... -
宏任务、微任务
2018-10-10 10:58:47宏任务与微任务? B-树中含511个关键字,B-树为3阶,则包含叶子节点层该树最大深度为? 8 9 10 11 -
一步步学习Linux多任务编程
2015-06-04 10:56:5502、Linux系统调用之I/O操作(文件操作)03、文件描述符的复制:dup(), dup2()多进程实现多任务04、进程的介绍05、Linux可执行文件结构与进程结构06、多进程实现多任务(一):fork()07、多进程实现多任务(二):... -
RxJava实现串行任务和并行任务
2019-09-16 14:53:14串行和并行,是针对任务这个概念而来的,也就是串行任务和并行任务。 那我们需要了解一下什么是任务。 用一个http网络请求来看,这一个网络请求就是一个任务。它包含了发送请求、后台处理、处理返回数据这几个步骤。... -
基于Spring的动态定时任务,可动态开启、关闭和取消任务
2020-06-22 15:21:37无配置文件实现动态定时任务,超级简单 详细介绍了如何利用spring框架实现了动态定时任务的功能,包括动态取消、动态修改任务执行时间等。本文给出了详细的代码示例,可即拿即用。可扩展性强,可根据自己的具体业务... -
宏任务与微任务
2018-10-29 17:45:44之前写过关于事件循环机制的文章 js 的并发模型一文,当时以为已经讲清楚所有这方面的概念了,但是最近又发现,事件循环机制还有宏任务与微任务这个概念没有涉及,所以这里延续之前的文章,再继续讲一讲。 -
Linux之crontab定时任务
2018-05-19 17:27:25一、概述 ...与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任... -
FreeRTOS 任务调度 任务切换
2016-10-15 17:07:34@(嵌入式) 简述 ...一般来说, 我们会在程序开始先创建若干个任务, 而此时任务调度器还没又开始运行,因此每一次任务创建后都会依据其优先级插入到就绪链表,同时保证全局变量 pxCurrentTCB 指向当 -
js中微任务和宏任务的区别
2019-08-15 10:38:262.微任务: 当前(此次事件循环中)宏任务执行完,在下一个宏任务开始之前需要执行的任务,可以理解为回调事件。(promise.then,proness.nextTick等等)。 3. 宏任务中的事件放在callback queue中,由事件触发线程... -
计划任务
2019-03-23 16:07:22一、 at 一次性计划任务 使用at制定一次性计划任务前需要确保atd服务是开启的,否则计划任务不会被执行。 使用systemctl start atd 开启服务 使用systemctl enable atd 确保该服务开机自启 at : 在指定的时间执行... -
FreeRTOS 任务调度 任务创建
2016-10-13 00:30:16@(嵌入式) 简述 任务状态 使用示例 数据结构 TCB 链表 任务创建 静态创建任务 动态创建任务 初始化任务控制块 ...涉及到的链表组织见文章 任务状态系统运行过程,任务可能处于以下各种状态,各个状态之间切换 -
node中我对Event Loop和宏任务,微任务的理解
2019-10-24 13:49:37异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。 只要主线程空了,就会去读取"任务队... -
同步任务与异步任务理解整理
2019-02-14 10:58:01同步任务:会立即执行的任务 异步任务:不会立即执行的任务(异步任务又分为宏任务与微任务) 常见的异步任务:Ajax,Dom事件操作,setTimeOut,promise的then方法,Node读取文件 任务在执行过程中的流程图展示 一.宏任务... -
定时任务的选型及改造
2018-03-24 23:18:39项目中用到了定时任务,项目之初为了快速开发上线,当时直接采用最简单的Linux自带的crontab;项目逐渐维定下来时,针对定时任务自己进行了相关研究,并根据项目实际情况进行了对比以及相关改造。 【比一比&改... -
【定时任务】Spring Boot 定时执行任务详解,每天定时几点钟执行任务
2020-06-10 19:35:18二、基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了。 三、基于注解设定多线程定时任务 一... -
任务延时、任务挂起、解除任务挂起、任务优先级获取和设置
2017-01-17 14:13:52FreeRTOS任务控制API函数主要实现任务延时、任务挂起、解除任务挂起、任务优先级获取和设置等功能。 1.相对延时 1.1函数描述 void vTaskDelay( portTickTypexTicksToDelay ) 调用vTaskDelay()函数后... -
Spring 整合 Quartz 实现动态定时任务(附demo)
2016-05-01 18:57:24最近项目中需要用到定时任务的功能,虽然Spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大。在考虑之后,决定整合更为专业的Quartz来实现定时任务功能。普通定时任务首先,当然是添加依赖... -
UCOSIII任务调度和任务切换
2018-12-04 20:15:461、UCOSIII任务调度 1.1、可剥夺型任务调度: 任务调度就是中止当前正在运行的任务转而去执行其他的任务。 UCOSIII是可剥夺型内核,因此当一个高优先级的任务准备就绪,并且此时发生了任务调度,那么这个高优先级...
-
Android_风格切换简单思路.7z
-
前端性能优化
-
gmp大数库,静态链接库,无须编译,直接可以用,并附使用手册
-
spring3 mvc+mybatis+velocity+maven
-
VS2019使用clang-format实现源代码格式化排版
-
ExtractAward.zip
-
VS2013串口通信
-
惯导轨迹发生器(产生陀螺仪与加速度计的数据)
-
ubuntu+freeradius搭建EAP-TLS双向认证测试环境.docx
-
机器学习-白板推导系列(五)-降维(Dimensionality Reduction)
-
【数据分析-随到随学】机器学习模型及应用
-
SAP ME 使用者手冊
-
hive开启动态分区,文件压缩
-
返回工具类
-
(新)备战2021软考软件设计师学习教程培训套餐
-
W615 V3 集客.rar
-
光流场及光流技术研究论文.doc
-
Cocos Creator游戏开发-连连看 (接入腾讯优量汇广告)
-
[Mybatis generator扩展] mybatis generator 自定义类
-
java socket 聊天系统