周期任务-选举领航者

每隔单位时间执行一次任务,多节点需要同步

 1     @Autowired
 2     RedissonClient redissonClient;
 3 
 4     /**
 5      * 时间分片
 6      */
 7     private final static long INTERVAL = 30_000L;
 8     /**
 9      * 对象名
10      */
11     private final static String BUCKET_NAME = "";
12     /**
13      * 上次时间分片数
14      */
15     private static long lastTotalIntervals = 0;
16     /**
17      * 领航者标识
18      */
19     private static boolean lastProcess = false;
20 
21     /**
22      * 判断本次是否执行操作
23      * 每 INTERVAL << 1 重新选举
24      *
25      * @return TRUE | FALSE
26      */
27     private boolean operateOneInterval() {
28         // 领航者优先一个时间分片,最多两次运行机会
29         long currentTotalIntervals =
30                 ((lastProcess ? INTERVAL : 0L) + System.currentTimeMillis())
31                         / (INTERVAL << 1);
32         // 比较本地分片
33         if (currentTotalIntervals > lastTotalIntervals) {
34             RBucket<Long> oneIntervalBucket = redissonClient.getBucket(BUCKET_NAME);
35             // 比较最新分片
36             Long redisTotalIntervals = oneIntervalBucket.get();
37             if (Objects.isNull(redisTotalIntervals)
38                     || currentTotalIntervals > (lastTotalIntervals = redisTotalIntervals)) {
39                 boolean beforeStatue = lastProcess;
40                 // 选举领航者,更新标识
41                 lastProcess = oneIntervalBucket.compareAndSet(redisTotalIntervals, currentTotalIntervals);
42                 System.out.printf("争抢结果:%b, 节点变更:%b", lastProcess, beforeStatue != lastProcess);
43             }
44         }
45         return lastProcess;
46     }

 

posted @ 2022-07-08 17:16  河图书卦  阅读(31)  评论(0编辑  收藏  举报