• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

河图书卦

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

周期任务-选举领航者

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

 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 on 2022-07-08 17:16  河图书卦  阅读(37)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3