【java】【布式锁实战多节点】【多节点定时任务只执行一次】

1 需求

需求,由于现在定时任务较多,bash项目单机部署压力过大、效率太低,现需要多机部署,并且当前时刻只能有一个定时任务成功执行。

在这里插入图片描述

2 日志分析程序

public static void main(String[] args) throws Exception {

        String fileName = "C:\\Users\\rosh\\Desktop\\logs\\上报日志.txt";
        File file = new File(fileName);
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String line;
        Map<String, List<String>> map = new HashMap<>();
        //统计
        while ((line = br.readLine()) != null) {
            String dateTime = line.substring(0, 20);
            List<String> list = map.getOrDefault(dateTime, new ArrayList<>());
            list.add(line);
            map.put(dateTime, list);
        }

        //分析
        for (Map.Entry<String, List<String>> set : map.entrySet()) {
            List<String> list = set.getValue();
            if (list.size() >= 2) {
                for (String str : list) {
                    System.out.println(str);
                }
                System.out.println("");
            }
        }

    }

3 JAVA demo环境概述

启3个springboot项目,端口不一致,定时任务代码一致。
在这里插入图片描述

4 分布式锁解决方案

当前任务获取锁,如果获取到锁,则执行任务,如果获取不到,则什么都不干。
Code:

@Configuration
@Slf4j
public class ReportSchedule {

    @Autowired
    private RedissonClient redissonClient;

    @Value("${server.port}")
    private String port;

    private static final String LOCK = "lock";

    @Scheduled(cron = "*/5 * * * * ?")
    public void reportTask() throws Exception {
        RLock lock = redissonClient.getLock(LOCK);
        if (lock.tryLock()) {
            try {
                String hostAddress = InetAddress.getLocalHost().getHostAddress();
                log.info("ip:{},端口:{},在执行上报任务......", hostAddress, port);
                log.error("mark");
            } finally {
                lock.unlock();
            }
        }
    }


}

检测任务:

日志:

2022-08-25 14:15:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:16:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:16:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:16:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:16:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:16:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:16:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:16:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:17:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:17:15 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:17:20 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:17:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:17:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:17:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:17:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:17:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:18:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:18:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:18:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:19:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:19:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:15:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:15:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:16:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:16:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:16:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:17:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:17:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:17:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:18:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:18:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:18:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:15:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:15:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:16:15 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:16:20 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:16:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:17:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:17:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:17:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:18:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:18:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:18:15 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:18:20 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:18:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:18:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:18:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:19:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......

检测结果:

在这里插入图片描述
问题: 由于任务执行的时间很短,A节点抢到锁释放锁完成了,B节点抢锁去发现就没有锁,导致上报任务重复执行。
在这里插入图片描述

5 分布式锁+标记解决方案

@Configuration
@Slf4j
public class ReportSchedule {

    @Autowired
    private RedissonClient redissonClient;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Value("${server.port}")
    private String port;

    private static final String LOCK = "lock";

    private static final String REPORT_TASK = "reportTask";


    @Scheduled(cron = "*/5 * * * * ?")
    public void reportTask() throws Exception {
        RLock lock = redissonClient.getLock(LOCK);
        if (lock.tryLock()) {
            try {
                String flag = redisTemplate.opsForValue().get(REPORT_TASK);
                //如果已经标记成功,那么不需要执行当前任务,
                if (StringUtils.isBlank(flag)) {
                    String hostAddress = InetAddress.getLocalHost().getHostAddress();
                    log.error("ip:{},端口:{},在执行上报任务......", hostAddress, port);
                    //上报成功后,打标记,标记时长为3秒
                    redisTemplate.opsForValue().set(REPORT_TASK, String.valueOf(1), 3, TimeUnit.SECONDS);
                }
            } finally {
                lock.unlock();
            }
        }
    }
}

检测任务:

日志:

2022-08-25 14:49:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:49:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:49:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:50:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:50:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:50:15 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:50:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:50:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:50:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:50:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:51:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:51:15 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:51:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:51:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:51:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:51:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:51:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:51:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:51:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:52:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:52:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:52:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:52:15 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:52:20 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:52:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:52:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:52:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:52:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:52:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:52:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:52:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:53:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:53:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:53:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:53:20 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:53:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:53:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:53:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:53:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:53:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:54:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:54:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:54:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:54:15 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:54:20 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:54:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:54:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:54:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:54:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:54:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:54:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:55:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:55:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:55:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:55:15 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:55:20 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:55:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:55:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:55:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:55:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:55:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:55:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:55:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:56:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:56:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 14:50:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:50:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:53:15 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:53:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:56:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 14:49:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:49:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:49:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:50:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:50:20 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:50:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:51:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:51:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:51:20 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:53:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 14:54:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......

检测结果:没有重复任务

在这里插入图片描述

缺陷: 如果节点A抢到锁,由于特殊原因(网络波动)执行失败,节点B、节点C不能执行当前任务。

在这里插入图片描述

6 抢锁等待时间解决方案

等待时间不能大于标记时间

@Configuration
@Slf4j
public class ReportSchedule {

    @Autowired
    private RedissonClient redissonClient;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Value("${server.port}")
    private String port;

    private static final String LOCK = "lock";

    private static final String REPORT_TASK = "reportTask";


    @Scheduled(cron = "*/5 * * * * ?")
    public void reportTask() throws Exception {
        RLock lock = redissonClient.getLock(LOCK);
        if (lock.tryLock(2, TimeUnit.SECONDS)) {
            try {
                String flag = redisTemplate.opsForValue().get(REPORT_TASK);
                //如果已经标记成功,那么不需要执行当前任务
                if (StringUtils.isBlank(flag)) {
                    String hostAddress = InetAddress.getLocalHost().getHostAddress();
                    log.error("ip:{},端口:{},在执行上报任务......", hostAddress, port);
                    //上报成功后,打标记,标记时长为3秒
                    redisTemplate.opsForValue().set(REPORT_TASK, String.valueOf(1), 3, TimeUnit.SECONDS);
                }
            } finally {
                lock.unlock();
            }
        }
    }

}

检测任务:

2022-08-25 15:06:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:06:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:06:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:06:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:07:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:07:15 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:07:20 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:07:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:07:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:08:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:08:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:08:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:08:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:08:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:08:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:09:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:10:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:10:15 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:10:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:10:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:10:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:10:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:11:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8666,在执行上报任务......
2022-08-25 15:06:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:07:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:07:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:08:15 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:08:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:08:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:09:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:09:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:09:15 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:09:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:09:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:09:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:10:00 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:10:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8667,在执行上报任务......
2022-08-25 15:06:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:07:10 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:07:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:07:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:07:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:07:45 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:08:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:08:20 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:08:40 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:09:20 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:09:25 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:09:35 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:09:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:09:55 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:10:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:10:20 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:10:30 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:10:50 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......
2022-08-25 15:11:05 [ERROR] [scheduling-1] c.l.s.ReportSchedule - ip:192.168.110.203,端口:8668,在执行上报任务......

检测结果:没有重复任务
在这里插入图片描述

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

响彻天堂丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值