为什么要创建定时任务?
在一个项目中,我们经常会遇到一个这样的场景:我需要定时的发送一条短信、邮件之类,也可能会定时的访问某些网页或检查和监控一些标志、参数等。
Spring Boot中的定时任务是什么样的?
就是通过@EnableScheduling、@Scheduled等一系列注解和配置类来完成定时任务的编写。
Spring Boot中如何编写定时任务?
Spring Boot中使用@Scheduled创建定时任务
在Spring Boot主类中加入@EnableScheduling注解,启用定时任务的配置
在定时任务类的需要定时的方法上加@Scheduled注解
@Scheduled的使用可以有如下几种方式:
@Scheduled(fixedRate=5000):上一次开始执行时间点之后5秒再执行
@Scheduled(fixedDelay=5000): 上一次执行完毕时间点之后5秒再执行
@Scheduled(initialDelay=1000, fixedRate=5000):第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
@Scheduled(cron="*/5* * * *"): 通过cron表达式定义规则
@Component
public class UpdateRunTimeTimerConfig{
privat final static int FIXED_RATE = 60 * 1000;
@Scheduled(fixedRate = FIXED_RATE)
@SchedulerLock(name = "timer", lockAtMostForString=, lockAtLeastForString=)
public void updateRunTime(){
// todo 更新数据库中处于运行中的每条任务的runTime
}
}
@SchedulerLock分布式锁
分布式锁的表结构:(在数据库中创建如下表结构的表)
CREATE TABLE shedlock(
name VARCHAR(64),
lock_until TIMESTAMP(3) NULL,
locked_at TIMESTAMP(3) NULL,
locked_by VARCHAR(255),
PRIMARY KEY (name)
)
添加依赖:(在Spring Boot中的对应子项目下添加如下关于Schedule定时任务的依赖)
// https://mvnrepository.com/artifact/net.javacrumbs.shedlock/shedlock-spring
compile group: 'net.javacrumbs.shedlock', name: 'shedlock-spring', version: '2.5.0'
// https://mvnrepository.com/artifact/net.javacrumbs.shedlock/shedlock-provider-jdbc-template
compile group: 'net.javacrumbs.shedlock', name: 'shedlock-provider-jdbc-template', version: '2.5.0'
配置:(配置任务计划程序:即将锁对应的数据库集成到Spring中)
import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;
@Configuration
@EnableScheduling
@EnableSchedulerLock()
public class ShelockConfig {
@Bean
public LockProvider lockProvider(DataSource dataSource) {
return new JdbcTemplateLockProvider(dataSource);
}
@Bean
public ScheduledLockConfiguration(LockProvider lockProvider) {
return ScheduledLockConfigurationBuilder
.withLockProvider(lockProvider)
.withPoolSize(10)
.withDefaultLockAtMostFor()
.build();
}
}
运行程序,定时任务即可正常工作。(@http://blog.didispace.com/springbootscheduled/)