配置SchedulerLock
<!-- SchedulerLock 所需依赖-->
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-redis-spring</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
package com.qhdsx.apollo.module.misc.config;
import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.redis.spring.RedisLockProvider;
import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
/**
* defaultLockAtMostFor 指定在执行节点结束时应保留锁的默认时间使用ISO8601 Duration格式
* 作用就是在被加锁的节点挂了时,无法释放锁,造成其他节点无法进行下一任务
* 这里默认55s
*/
/**
* <h4>ace-apollo</h4>
* <p> SchedulerLock 基于 Redis 的配置</p>
*
* @author : hc
* @date : 2021-11-24 09:58
**/
@Configuration
@EnableSchedulerLock(defaultLockAtMostFor = "PT55S")
public class ShedLockRedisConfig{
@Bean
public LockProvider lockProvider(RedisConnectionFactory connectionFactory) {
return new RedisLockProvider(connectionFactory);
}
}
/**
* @params
* @Description
* name 不要和其它的定时任务的name重复 是唯一标识 用类名就可以
* lockAtLeastForString 的作用是为了防止在任务开始之初由于各个服务器同名任务的服务器时间差,启动时间差等这些造成的一些问题,有了这个时间设置后,
* 就可以避免因为上面这些小的时间差造成的一些意外,保证一个线程在抢到锁后,即便很快执行完,也不要立即释放,留下一个缓冲时间。
* 这样等多个线程都启动后,由于任务已经被锁定,其他没有获得锁的任务也不会再去抢锁。注意这里的时间不要设置几秒几分钟,尽量大些
* lockAtMostForString 这个设置的作用是为了防止抢到锁的那个线程,因为一些意外死掉了,而锁又始终不被释放。
* 这样的话,虽然当前执行周期虽然失败了,但以后的执行周期如果这里一直不释放的话,后面就永远执行不到了。
* 它的目的不在于隐藏任务,更重要的是,释放锁,并且查找解决问题。
*
* 带有string后缀的是 ISO8601 Duration格式 的时间格式 P为开始 T为年月日和时分秒的区分
* 1Y - 一年
* 1W - 一周
* 2M - 两个月
* 10D - 十天
* 2H - 两个小时
* 30M - 三十分钟
* 15S 十五秒钟
* 举例 : P1DT1M - 一天一分钟
* P1W - 一周
* PT1H - 一小时
* PT10S - 十秒
*
* 也可以用lockAtLeastFor 和 lockAtMostFor 单位是 毫秒 和String类型的同理
*
* 注意!!!!!!!!
* lockAtMostFor 的数值 要大于等于 lockAtLeastFor
* @Author Hc
* @CreateUser: Hc
* @CreateDate 2021/11/24 11:03
* @Version 1.0
* @Return
**/
@Scheduled(cron = "0/3 * * * * ? ")
// @SchedulerLock(name = "scheduledController_notice",lockAtLeastForString = "PT2S", lockAtMostForString = "PT2S")
@SchedulerLock(name = "testMisc",lockAtLeastFor = 4*1000, lockAtMostFor = 6*1000)
public void testMisc(){
log.info ( "定时任务测试" );
eleOrderlyChargingFeign.runMisc();
}