Bootstrap

Spring Boot创建定时任务(分布式HA)

为什么要创建定时任务?
  在一个项目中,我们经常会遇到一个这样的场景:我需要定时的发送一条短信、邮件之类,也可能会定时的访问某些网页或检查和监控一些标志、参数等。

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/)

;