|
@@ -86,11 +86,30 @@ public class MenuServiceImpl implements MenuService {
|
|
|
@Override
|
|
|
@PostConstruct
|
|
|
public synchronized void initLocalCache() {
|
|
|
- // 获取菜单列表,如果有更新
|
|
|
- List<MenuDO> menuList = this.loadMenuIfUpdate(maxUpdateTime);
|
|
|
- if (CollUtil.isEmpty(menuList)) {
|
|
|
+ initLocalCacheIfUpdate(null);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD)
|
|
|
+ public void schedulePeriodicRefresh() {
|
|
|
+ initLocalCacheIfUpdate(this.maxUpdateTime);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 刷新本地缓存
|
|
|
+ *
|
|
|
+ * @param maxUpdateTime 最大更新时间
|
|
|
+ * 1. 如果 maxUpdateTime 为 null,则“强制”刷新缓存
|
|
|
+ * 2. 如果 maxUpdateTime 不为 null,判断自 maxUpdateTime 是否有数据发生变化,有的情况下才刷新缓存
|
|
|
+ */
|
|
|
+ private void initLocalCacheIfUpdate(LocalDateTime maxUpdateTime) {
|
|
|
+ // 如果没有增量的数据变化,则不进行本地缓存的刷新
|
|
|
+ if (maxUpdateTime != null
|
|
|
+ && menuMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) {
|
|
|
+ log.info("[initLocalCacheIfUpdate][数据未发生变化({}),本地缓存不刷新]", maxUpdateTime);
|
|
|
return;
|
|
|
}
|
|
|
+ List<MenuDO> menuList = menuMapper.selectList();
|
|
|
+ log.info("[initLocalCacheIfUpdate][缓存菜单,数量为:{}]", menuList.size());
|
|
|
|
|
|
// 构建缓存
|
|
|
ImmutableMap.Builder<Long, MenuDO> menuCacheBuilder = ImmutableMap.builder();
|
|
@@ -103,34 +122,9 @@ public class MenuServiceImpl implements MenuService {
|
|
|
});
|
|
|
menuCache = menuCacheBuilder.build();
|
|
|
permissionMenuCache = permMenuCacheBuilder.build();
|
|
|
- maxUpdateTime = CollectionUtils.getMaxValue(menuList, MenuDO::getUpdateTime);
|
|
|
- log.info("[initLocalCache][缓存菜单,数量为:{}]", menuList.size());
|
|
|
- }
|
|
|
|
|
|
- @Scheduled(fixedDelay = SCHEDULER_PERIOD, initialDelay = SCHEDULER_PERIOD)
|
|
|
- public void schedulePeriodicRefresh() {
|
|
|
- initLocalCache();
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 如果菜单发生变化,从数据库中获取最新的全量菜单。
|
|
|
- * 如果未发生变化,则返回空
|
|
|
- *
|
|
|
- * @param maxUpdateTime 当前菜单的最大更新时间
|
|
|
- * @return 菜单列表
|
|
|
- */
|
|
|
- private List<MenuDO> loadMenuIfUpdate(LocalDateTime maxUpdateTime) {
|
|
|
- // 第一步,判断是否要更新。
|
|
|
- if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据
|
|
|
- log.info("[loadMenuIfUpdate][首次加载全量菜单]");
|
|
|
- } else { // 判断数据库中是否有更新的菜单
|
|
|
- if (menuMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- log.info("[loadMenuIfUpdate][增量加载全量菜单]");
|
|
|
- }
|
|
|
- // 第二步,如果有更新,则从数据库加载所有菜单
|
|
|
- return menuMapper.selectList();
|
|
|
+ // 设置最新的 maxUpdateTime,用于下次的增量判断
|
|
|
+ this.maxUpdateTime = CollectionUtils.getMaxValue(menuList, MenuDO::getUpdateTime);
|
|
|
}
|
|
|
|
|
|
@Override
|