您的位置:首页 > 教育 > 锐评 > SchedulerLock分布式定时任务锁

SchedulerLock分布式定时任务锁

2024/10/6 12:28:25 来源:https://blog.csdn.net/letterss/article/details/140372377  浏览:    关键词:SchedulerLock分布式定时任务锁

1.pom中引入依赖,这里使用redis作为锁

        <dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-spring</artifactId><version>4.12.0</version></dependency><dependency><groupId>net.javacrumbs.shedlock</groupId><artifactId>shedlock-provider-redis-spring</artifactId><version>4.12.0</version></dependency>

2.yml配置redis连接

spring:redis:host: localhostport: 6379database: 0taskrelease: taskrelease

3.配置redis序列化

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// 使用Jackson2JsonRedisSerialize 替换默认序列化Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);// 设置value的序列化规则和 key的序列化规则redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.afterPropertiesSet();return redisTemplate;}
}

4.线程池和分布式锁配置 


import lombok.extern.slf4j.Slf4j;
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;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;import javax.annotation.Resource;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
@EnableSchedulerLock(defaultLockAtMostFor = "PT30M")
@Slf4j
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {@ResourceExecutorService scheduledThreadPoolExecutor;/****/@Beanpublic ThreadPoolTaskExecutor threadPoolTaskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//最大线程数executor.setMaxPoolSize(8);//核心线程数executor.setCorePoolSize(8);//任务队列的大小executor.setQueueCapacity(100);//线程前缀名executor.setThreadNamePrefix("common-");//线程存活时间executor.setKeepAliveSeconds(30);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());//线程初始化executor.initialize();return executor;}/*** 动态调度任务线程池*/@Beanpublic ThreadPoolTaskScheduler threadPoolTaskScheduler() {ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();// 线程池大学threadPoolTaskScheduler.setPoolSize(15);// 线程名称threadPoolTaskScheduler.setThreadNamePrefix("taskScheduler-");// 等待时长threadPoolTaskScheduler.setAwaitTerminationSeconds(60);// 调度器shutdown被调用时等待当前被调度的任务完成threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);return threadPoolTaskScheduler;}/*** Schedule定时任务指定线程池* Spring注解*/@Bean(name = "scheduledThreadPoolExecutor")public ScheduledThreadPoolExecutor scheduledThreadPoolExecutor() {return new ScheduledThreadPoolExecutor(15);}@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {//显式为Scheduler指定线程池taskRegistrar.setScheduler(scheduledThreadPoolExecutor);}/*** 分布式锁* Schedule定时任务, Spring注解*/@Beanpublic LockProvider lockProvider(RedisConnectionFactory connectionFactory) {return new RedisLockProvider(connectionFactory, System.getProperty("spring.profiles.active"));}
}

5.执行任务方法

    @Scheduled(cron = "0 0 23 * * ?")@SchedulerLock(name = "synchronizeAddDept", lockAtLeastFor = "PT15S")public void synchronizeAddDept() {StopWatch watch = new StopWatch();watch.start();log.info("====================> 同步部门数据开始, {}", LocalDateTime.now());watch.stop();log.info("====================> 同步部门数据结束, {}, 用时 {}", LocalDateTime.now(), watch.getTotalTimeSeconds());
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com