使用redisson控制多个springboot实例负载同时只有一个实例执行任务

一 redisson依赖

<!--        redisson 依赖-->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.23.4</version>
        </dependency>

二 定时任务代码

package com.hzf.work.task;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @author: hzf
 * @create: 2024-01-25 10:11
 **/
@Component
@Slf4j
@RequiredArgsConstructor
public class TestTask {
    @Value("${server.port}")
    private Integer port;
    private final RedissonClient redissonClient;
//    private final TestService test;

    @Scheduled(fixedRate = 5000) //每5秒执行一次
    public void sayHello() throws InterruptedException {
//        定义分布式锁名称
        String locaName = "hzf";
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String format = now.format(formatter);
//        获取分布式锁
        RLock lock = redissonClient.getLock(locaName);
        try {
            if (lock.tryLock()) {
                //模拟任务执行时间
                Thread.sleep(4000);
                System.out.println(format + "  port" + port);
            } else {
                //没有获取到锁,说明其他服务正在执行定时任务
                System.out.println("未获取到所,其他服务正在执行定时任务");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (lock.tryLock()) {
                lock.unlock();
            }
        }
    }

}

三 结果验证

        将项目复制2-3份,修改每个项目的application.yml文件中的端口,保证每个项目运行的端口不同,将项目全部启动。查看结果如下

       当三个项目全部启动时。首先时8003端口的项目拿到了资源,并且执行了任务。剩下两个实例都没有拿到资源,所以打印未获取到所,其他服务正在执行定时任务。关掉8003服务,换成了8002实例拿到了资源,开始执行任务。再将8002实例关掉,8001实例才开始执行任务。


 

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值