Monogo
DynamoDB
JdbcTemplate
ZooKeeper (using Curator)
Redis (using Spring RedisConnectionFactory)
Redis (using Jedis)
Hazelcast
第一步引入依赖
net.javacrumbs.shedlock
shedlock-spring
4.11.1
net.javacrumbs.shedlock
shedlock-provider-jdbc-template
4.11.1
第二步添加配置类
importnet.javacrumbs.shedlock.core.LockProvider;importnet.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.jdbc.core.JdbcTemplate;importjavax.annotation.Resource;importjavax.sql.DataSource;importjava.util.TimeZone;/*** @descrition shedlock配置类
*@since2021-01-10 22:39*/@Configurationpublic classShedLockConfig {
@ResourceprivateDataSource dataSource;/*** @description
* @date 2021/1/10 22:39*/@BeanpublicLockProvider lockProvider() {return newJdbcTemplateLockProvider(
JdbcTemplateLockProvider.Configuration.builder()
.withJdbcTemplate(newJdbcTemplate(dataSource))
.withTimeZone(TimeZone.getTimeZone("GMT+8"))
.build()
);
}
}
第三步,添加公共存储,前面我们说过shedlock支持多种公共存储作为锁,本文我们以mysql为例
CREATE TABLEshedlock (
NAMEVARCHAR ( 64 ) NOT NULL,
lock_untilTIMESTAMP ( 3 ) NOT NULL,
locked_atTIMESTAMP ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3),
locked_byVARCHAR ( 255 ) NOT NULL,PRIMARY KEY( NAME )
);
第四步,添加具体任务类
importlombok.extern.slf4j.Slf4j;importnet.javacrumbs.shedlock.spring.annotation.SchedulerLock;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Component;importjava.text.SimpleDateFormat;importjava.util.Date;/***@authorshane
* @date 2021/1/10 23:39*/@Slf4j
@Componentpublic classTestJob {/*** @description 每隔1min打印一次
* @date 2021/1/10 23:39*/@Scheduled(cron= "0 0/1 * * * ?")//lockAtMostFor为锁默认持有时间,会覆盖启动类中的默认持有时间
@SchedulerLock(name = "demo", lockAtMostFor = "70m")public void print() throwsInterruptedException {
SimpleDateFormat df= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
log.warn("当前时间:"+df.format(newDate()));
}
}
接着,我们复制一份代码,分别启动两个实例来看结果
数据库记录
@SchedulerLock注解参数说明
name:定时任务的名字,就是数据库中的内个主键
lockAtMostFor:锁的最大时间单位为毫秒
lockAtLeastFor:锁的最小时间单位为毫秒
对了,还有启动类的配置
@SpringBootApplication
@MapperScan("com.example.test.mapper")
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor= "10m") // 默认的锁的时间public classTestApplication {public static voidmain(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
参考出处: https://www.jianshu.com/p/941416645606
shedlock的github地址:https://github.com/lukas-krecan/ShedLock