springboot动态创建定时任务,springboot可配置定时任务
如何解决写爬虫IP受阻的问题?立即使用。
如果想了解更多跳羚的信息,可以点击:JAVA教程
使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式:
一、基于注解(@Scheduled)
二、基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了。
三、基于注解设定多线程定时任务
一、静态:基于注解
基于@Scheduled默认为单线程的注意,当启动多个任务时,任务的执行时间会受到前一个任务执行时间的影响。
1、创建定时器
使用SpringBoot创建基于注释的定时任务非常简单,只需几行代码就可以完成。代码如下:
@组件
@配置//1。主要用于标记配置类,具有组件的作用。
@EnableScheduling //2。启动计划任务
公共类SaticScheduleTask {
//3.添加计划任务
@Scheduled(cron=0/5 * * * *?)
//或者直接指定时间间隔,例如:5秒
//@Scheduled(fixedRate=5000)
私有void configureTasks() {
System.err.println(执行静态定时任务的时间: local datetime . now());
}
}Cron表达式参数分别表示:
秒(0~59),例如0/5表示每隔5秒。
分数(0~59)
小时(0~23)
当天(0~31),需要计算
月份(0~11)
周(您可以填写1-7或星期日/星期一/TUE/星期三/THU/星期五/星期六)
@Scheduled:除了支持灵活的参数表达式cron,还支持简单的延迟操作,比如fixedDelay,fixedRate只能填写对应的毫秒。
2、启动测试
启动应用程序,您可以看到控制台打印出以下信息:
很明显,使用@Scheduled注释很方便,但缺点是当我们调整执行周期时,需要重启应用程序才能生效,有些不方便。为了达到实时的效果,你可以使用界面来完成定时的任务。
二、动态:基于接口
基于接口(调度配置器)
1、导入依赖包
父母
groupIdorg.springframework.boot/groupId
artifactId spring-boot-starter/artifactId
version2.0.4.RELEASE/version
/父母
属国
依赖!-添加Web依赖项-
groupIdorg.springframework.boot/groupId
artifactId spring-boot-starter-web/artifactId
/依赖关系
依赖!-添加MySql依赖项-
groupIdmysql/groupId
artifactId MySQL-连接器-java/artifactId
/依赖关系
依赖!-添加一些Mybatis依赖的初始化的东西来配置mybatis-
groupIdorg.mybatis.spring.boot/groupId
artifactId mybatis-spring-boot-starter/artifactId
版本1 . 3 . 1/版本
/依赖关系
依赖!-添加mybatis依赖项-
groupIdorg.mybatis/groupId
artifactIdmybatis/artifactId
版本3 . 4 . 5/版本
scope编译/范围
/依赖关系
/依赖项2、添加数据库记录
打开本地数据库mysql,随便打开查询窗口,然后执行脚本内容如下:
如果存在“socks ”,则删除数据库;
创建数据库“socks ”;
使用“袜子”;
如果存在“cron ”,则删除表;
创建表“cron ”(
` cron_id` varchar(30)非空主键,
` cron varchar(30)不为空
);
插入 cron 值( 1 , 0/5 * * * *?);
然后在项目的application.yml中添加数据源:
春天:
数据源:
URL:JDBC:MySQL://localhost:3306/socks
用户名:root
密码:1234563、创建定时器
在数据库为数据做好准备之后,我们编写定时任务。注意这里添加了TriggerTask。目的是循环读取我们在数据库中设置的执行周期,以及执行相关定时任务的内容。
具体代码如下:
@组件
@配置//1。主要用于标记配置类,具有组件的作用。
@EnableScheduling //2。启动计划任务
公共类DynamicScheduleTask实现调度配置器{
@Mapper
公共接口CronMapper {
@Select(从cron限制1中选择cron )
公共字符串getCron();
}
@自动连线//注入映射器
@SuppressWarnings(all )
CronMapper克隆映射程序;
/**
*执行计划任务。
*/
@覆盖
public void configure tasks(scheduled task registrar task registrar){
taskRegistrar.addTriggerTask(
//1.添加任务内容(可运行)
()-System.out.println(执行动态计时任务: localdatetime.now()。到localtime()),
//2.设置执行周期(触发器)
triggerContext - {
//2.1从数据库中获取执行周期
string cron=cron mapper . getcron();
//2.2合法性检查。
if (StringUtils.isEmpty(cron)) {
//省略代码.
}
//2.3返回执行周期(日期)
返回新的CronTrigger(cron)。nextExecutionTime(trigger context);
}
);
}
}4、启动测试
应用程序启动后,检查控制台,打印时间如我们所料是每10秒一次:
然后打开Navicat,将执行周期修改为每6秒,如图所示:
看控制台,很方便的发现执行周期变了,我们不需要重启应用了。如图所示:
注意:如果修改数据库时出现格式错误,即使修改正确,调度任务也会停止;此时,您只能重启项目进行恢复。
三、多线程定时任务
基于注释设置多线程定时任务
1.创建多线程定时任务。
//@组件注释用于注释那些中性类;
//分别与持久层、业务层和控制层的@Repository、@Service和@Controller进行比较,对层次结构中的类进行了注释。
@组件
@EnableScheduling //1。启动计划任务
@EnableAsync //2。开始多线程
公共类MultithreadScheduleTask {
@Async
@Scheduled(fixedDelay=1000) //每秒
public void first()引发InterruptedException {
第一个计划任务开始: localdatetime.now()。to local time() \ r \ n thread: thread . current thread()。getName()));
system . out . println();
thread . sleep(1000 * 10);
}
@Async
@Scheduled(固定延迟=2000)
public void second() {
第二个计划任务开始: localdatetime.now()。to local time() \ r \ n thread: thread . current thread()。getName()));
system . out . println();
}
}2、启动测试
应用程序启动后,检查控制台:
从控制台可以看出,第一次定时任务和第二次定时任务互不影响;
而且由于开启了多线程,第一个任务的执行时间也不受其本身执行时间的限制,所以需要注意可能会出现重复操作导致数据异常。以上是如何创建springboot定时任务的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。