使用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实例才开始执行任务。


 

相关推荐

  1. 在Spring Boot项目中使用Redisson实现延迟执行

    2024-01-26 22:48:04       8 阅读
  2. springboot一个接口实现类的调用方式

    2024-01-26 22:48:04       38 阅读
  3. gradio服务实现负载均衡

    2024-01-26 22:48:04       64 阅读
  4. 使用SpringBoot实现定时任务

    2024-01-26 22:48:04       22 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-26 22:48:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-26 22:48:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-26 22:48:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-26 22:48:04       18 阅读

热门阅读

  1. 前端笔试题(十)

    2024-01-26 22:48:04       40 阅读
  2. 69.x 的平方根(力扣LeetCode)

    2024-01-26 22:48:04       29 阅读
  3. mysql sql查询

    2024-01-26 22:48:04       39 阅读
  4. 学习 canvas标签 这一篇文章足以

    2024-01-26 22:48:04       23 阅读
  5. Git的常用命令

    2024-01-26 22:48:04       36 阅读
  6. JVM实战(33)——内存溢出之内存使用率过高

    2024-01-26 22:48:04       39 阅读