一种基于Redisson实现简单的分布式定时任务执行方案

一种基于Redisson实现简单的分布式定时任务执行方案一般在springcloud下单机执行定时任务的代码 但因为微服务下一般是多实例部署,会导致定时任务多个实例同时执行的情况。 通过对EnableScheduling进行分析,在调用定时方法时会把Met

一般在springcloud下单机执行定时任务的代码

@EnableScheduling
public class TestTask {

    @Scheduled(cron = "0 * * * * ?")
    public void test() {
        System.out.println("say hello");
    }
}

但因为微服务下一般是多实例部署,会导致定时任务多个实例同时执行的情况。 通过对EnableScheduling进行分析,在调用定时方法时会把Method封装成Runnable执行,并且createRunnable可以重写。 因此,只要在Runnable运行时加分布式锁,保证只有一个实例可以获取到锁并执行任务。

@Slf4j
@Configuration
public class SchedulingConfig {

    @Autowired
    private RedissonClient redissonClient;

    @Bean
    public ScheduledTaskRegistry scheduledTaskRegistry() {
        return new ScheduledTaskRegistry(redissonClient);
    }

    public static class ScheduledTaskRegistry extends ScheduledAnnotationBeanPostProcessor {

        private RedissonClient redissonClient;

        public ScheduledTaskRegistry(RedissonClient redissonClient) {
            this.redissonClient = redissonClient;
        }

        public ScheduledTaskRegistry(ScheduledTaskRegistrar registrar, RedissonClient redissonClient) {
            super(registrar);
            this.redissonClient = redissonClient;
        }

        @Override
        protected Runnable createRunnable(Object target, Method method) {
            String redisKey = RedisKeyUtil.getKey("stask", method.getDeclaringClass().getName() + "." + method.getName());
            RLock lock = redissonClient.getLock(redisKey);
            Runnable runnable = super.createRunnable(target, method);
            return () -> {
                if (!lock.tryLock()) {
                    log.info("运行中: {}", redisKey);
                    return;
                }
                log.info("运行: {}", redisKey);
                try {
                    runnable.run();
                } finally {
                    lock.unlock();
                }
            };
        }
    }
}

延伸

也可以通过redis分布式锁实现简单的选举leader功能。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/36698.html

(0)
上一篇 2023-11-15
下一篇 2023-11-15

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注