mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-26 09:11:52 +08:00
1. 配置的缓存刷新机制
This commit is contained in:
parent
7813c4019a
commit
545e9d2a0f
@ -28,6 +28,8 @@ public class DBConfigRepository extends AbstractConfigRepository {
|
|||||||
|
|
||||||
private final static ScheduledExecutorService m_executorService;
|
private final static ScheduledExecutorService m_executorService;
|
||||||
|
|
||||||
|
private static DBConfigRepository INSTANCE;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
m_executorService = Executors.newScheduledThreadPool(1,
|
m_executorService = Executors.newScheduledThreadPool(1,
|
||||||
ApolloThreadFactory.create(DBConfigRepository.class.getSimpleName(), true));
|
ApolloThreadFactory.create(DBConfigRepository.class.getSimpleName(), true));
|
||||||
@ -64,6 +66,19 @@ public class DBConfigRepository extends AbstractConfigRepository {
|
|||||||
this.trySync();
|
this.trySync();
|
||||||
// 初始化定时任务
|
// 初始化定时任务
|
||||||
this.schedulePeriodicRefresh();
|
this.schedulePeriodicRefresh();
|
||||||
|
|
||||||
|
// 设置单例
|
||||||
|
INSTANCE = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通知同步,
|
||||||
|
*/
|
||||||
|
public static void noticeSync() {
|
||||||
|
// 提交到线程池中,避免和 schedulePeriodicRefresh 并发问题
|
||||||
|
m_executorService.submit(() -> {
|
||||||
|
INSTANCE.trySync();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -127,7 +142,6 @@ public class DBConfigRepository extends AbstractConfigRepository {
|
|||||||
Tracer.logEvent("Apollo.Client.Version", Apollo.VERSION);
|
Tracer.logEvent("Apollo.Client.Version", Apollo.VERSION);
|
||||||
}, m_configUtil.getRefreshInterval(), m_configUtil.getRefreshInterval(),
|
}, m_configUtil.getRefreshInterval(), m_configUtil.getRefreshInterval(),
|
||||||
m_configUtil.getRefreshIntervalTimeUnit());
|
m_configUtil.getRefreshIntervalTimeUnit());
|
||||||
// TimeUnit.SECONDS);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========== 数据库相关操作 ==========
|
// ========== 数据库相关操作 ==========
|
||||||
|
@ -19,6 +19,8 @@ public class RedisKeyDefine {
|
|||||||
HASH,
|
HASH,
|
||||||
SET,
|
SET,
|
||||||
ZSET,
|
ZSET,
|
||||||
|
STREAM,
|
||||||
|
PUBSUB
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
package cn.iocoder.dashboard.modules.infra.mq.consumer.config;
|
||||||
|
|
||||||
|
import cn.iocoder.dashboard.framework.apollo.internals.DBConfigRepository;
|
||||||
|
import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
|
||||||
|
import cn.iocoder.dashboard.modules.infra.mq.message.config.InfConfigRefreshMessage;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 针对 {@link InfConfigRefreshMessage} 的消费者
|
||||||
|
*
|
||||||
|
* @author 芋道源码
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
@Slf4j
|
||||||
|
public class InfConfigRefreshConsumer extends AbstractChannelMessageListener<InfConfigRefreshMessage> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onMessage(InfConfigRefreshMessage message) {
|
||||||
|
log.info("[onMessage][收到 Config 刷新消息]");
|
||||||
|
DBConfigRepository.noticeSync();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
package cn.iocoder.dashboard.modules.infra.mq.consumer;
|
@ -0,0 +1,17 @@
|
|||||||
|
package cn.iocoder.dashboard.modules.infra.mq.message.config;
|
||||||
|
|
||||||
|
import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 配置数据刷新 Message
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class InfConfigRefreshMessage implements ChannelMessage {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getChannel() {
|
||||||
|
return "infra.config.refresh";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
package cn.iocoder.dashboard.modules.infra.mq.message;
|
@ -0,0 +1,27 @@
|
|||||||
|
package cn.iocoder.dashboard.modules.infra.mq.producer.config;
|
||||||
|
|
||||||
|
import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
|
||||||
|
import cn.iocoder.dashboard.modules.infra.mq.message.config.InfConfigRefreshMessage;
|
||||||
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Config 配置相关消息的 Producer
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class InfConfigProducer {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StringRedisTemplate stringRedisTemplate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送 {@link InfConfigRefreshMessage} 消息
|
||||||
|
*/
|
||||||
|
public void sendConfigRefreshMessage() {
|
||||||
|
InfConfigRefreshMessage message = new InfConfigRefreshMessage();
|
||||||
|
RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1 @@
|
|||||||
|
package cn.iocoder.dashboard.modules.infra.mq.producer;
|
@ -10,6 +10,7 @@ import cn.iocoder.dashboard.modules.infra.convert.config.InfConfigConvert;
|
|||||||
import cn.iocoder.dashboard.modules.infra.dal.mysql.dao.config.InfConfigMapper;
|
import cn.iocoder.dashboard.modules.infra.dal.mysql.dao.config.InfConfigMapper;
|
||||||
import cn.iocoder.dashboard.modules.infra.dal.mysql.dataobject.config.InfConfigDO;
|
import cn.iocoder.dashboard.modules.infra.dal.mysql.dataobject.config.InfConfigDO;
|
||||||
import cn.iocoder.dashboard.modules.infra.enums.config.InfConfigTypeEnum;
|
import cn.iocoder.dashboard.modules.infra.enums.config.InfConfigTypeEnum;
|
||||||
|
import cn.iocoder.dashboard.modules.infra.mq.producer.config.InfConfigProducer;
|
||||||
import cn.iocoder.dashboard.modules.infra.service.config.InfConfigService;
|
import cn.iocoder.dashboard.modules.infra.service.config.InfConfigService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@ -30,6 +31,9 @@ public class InfConfigServiceImpl implements InfConfigService {
|
|||||||
@Resource
|
@Resource
|
||||||
private InfConfigMapper configMapper;
|
private InfConfigMapper configMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private InfConfigProducer configProducer;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PageResult<InfConfigDO> getConfigPage(InfConfigPageReqVO reqVO) {
|
public PageResult<InfConfigDO> getConfigPage(InfConfigPageReqVO reqVO) {
|
||||||
return configMapper.selectPage(reqVO);
|
return configMapper.selectPage(reqVO);
|
||||||
@ -58,6 +62,8 @@ public class InfConfigServiceImpl implements InfConfigService {
|
|||||||
InfConfigDO config = InfConfigConvert.INSTANCE.convert(reqVO);
|
InfConfigDO config = InfConfigConvert.INSTANCE.convert(reqVO);
|
||||||
config.setType(InfConfigTypeEnum.CUSTOM.getType());
|
config.setType(InfConfigTypeEnum.CUSTOM.getType());
|
||||||
configMapper.insert(config);
|
configMapper.insert(config);
|
||||||
|
// 发送刷新消息
|
||||||
|
configProducer.sendConfigRefreshMessage();
|
||||||
return config.getId();
|
return config.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,6 +74,8 @@ public class InfConfigServiceImpl implements InfConfigService {
|
|||||||
// 更新参数配置
|
// 更新参数配置
|
||||||
InfConfigDO updateObj = InfConfigConvert.INSTANCE.convert(reqVO);
|
InfConfigDO updateObj = InfConfigConvert.INSTANCE.convert(reqVO);
|
||||||
configMapper.updateById(updateObj);
|
configMapper.updateById(updateObj);
|
||||||
|
// 发送刷新消息
|
||||||
|
configProducer.sendConfigRefreshMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -80,6 +88,8 @@ public class InfConfigServiceImpl implements InfConfigService {
|
|||||||
}
|
}
|
||||||
// 删除
|
// 删除
|
||||||
configMapper.deleteById(id);
|
configMapper.deleteById(id);
|
||||||
|
// 发送刷新消息
|
||||||
|
configProducer.sendConfigRefreshMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkCreateOrUpdate(Long id, String key) {
|
private void checkCreateOrUpdate(Long id, String key) {
|
||||||
@ -113,4 +123,5 @@ public class InfConfigServiceImpl implements InfConfigService {
|
|||||||
throw ServiceExceptionUtil.exception(CONFIG_NAME_DUPLICATE);
|
throw ServiceExceptionUtil.exception(CONFIG_NAME_DUPLICATE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ public class SysDeptProducer {
|
|||||||
/**
|
/**
|
||||||
* 发送 {@link SysDeptRefreshMessage} 消息
|
* 发送 {@link SysDeptRefreshMessage} 消息
|
||||||
*/
|
*/
|
||||||
public void sendMenuRefreshMessage() {
|
public void sendDeptRefreshMessage() {
|
||||||
SysDeptRefreshMessage message = new SysDeptRefreshMessage();
|
SysDeptRefreshMessage message = new SysDeptRefreshMessage();
|
||||||
RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
|
RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ public class SysDictDataProducer {
|
|||||||
/**
|
/**
|
||||||
* 发送 {@link SysDictDataRefreshMessage} 消息
|
* 发送 {@link SysDictDataRefreshMessage} 消息
|
||||||
*/
|
*/
|
||||||
public void sendMenuRefreshMessage() {
|
public void sendDictDataRefreshMessage() {
|
||||||
SysDictDataRefreshMessage message = new SysDictDataRefreshMessage();
|
SysDictDataRefreshMessage message = new SysDictDataRefreshMessage();
|
||||||
RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
|
RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message);
|
||||||
}
|
}
|
||||||
|
@ -174,8 +174,8 @@ public class SysDeptServiceImpl implements SysDeptService {
|
|||||||
// 插入部门
|
// 插入部门
|
||||||
SysDeptDO dept = SysDeptConvert.INSTANCE.convert(reqVO);
|
SysDeptDO dept = SysDeptConvert.INSTANCE.convert(reqVO);
|
||||||
deptMapper.insert(dept);
|
deptMapper.insert(dept);
|
||||||
// 发送消息
|
// 发送刷新消息
|
||||||
deptProducer.sendMenuRefreshMessage();
|
deptProducer.sendDeptRefreshMessage();
|
||||||
return dept.getId();
|
return dept.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,8 +186,8 @@ public class SysDeptServiceImpl implements SysDeptService {
|
|||||||
// 更新部门
|
// 更新部门
|
||||||
SysDeptDO updateObj = SysDeptConvert.INSTANCE.convert(reqVO);
|
SysDeptDO updateObj = SysDeptConvert.INSTANCE.convert(reqVO);
|
||||||
deptMapper.updateById(updateObj);
|
deptMapper.updateById(updateObj);
|
||||||
// 发送消息
|
// 发送刷新消息
|
||||||
deptProducer.sendMenuRefreshMessage();
|
deptProducer.sendDeptRefreshMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -200,8 +200,10 @@ public class SysDeptServiceImpl implements SysDeptService {
|
|||||||
}
|
}
|
||||||
// 删除部门
|
// 删除部门
|
||||||
deptMapper.deleteById(id);
|
deptMapper.deleteById(id);
|
||||||
// 发送消息
|
// TODO 需要处理下与角色的数据权限关联,等做数据权限一起处理下
|
||||||
deptProducer.sendMenuRefreshMessage();
|
|
||||||
|
// 发送刷新消息
|
||||||
|
deptProducer.sendDeptRefreshMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkCreateOrUpdate(Long id, Long parentId, String name) {
|
private void checkCreateOrUpdate(Long id, Long parentId, String name) {
|
||||||
|
@ -160,8 +160,8 @@ public class SysDictDataServiceImpl implements SysDictDataService {
|
|||||||
// 插入字典类型
|
// 插入字典类型
|
||||||
SysDictDataDO dictData = SysDictDataConvert.INSTANCE.convert(reqVO);
|
SysDictDataDO dictData = SysDictDataConvert.INSTANCE.convert(reqVO);
|
||||||
dictDataMapper.insert(dictData);
|
dictDataMapper.insert(dictData);
|
||||||
// 发送消息
|
// 发送刷新消息
|
||||||
dictDataProducer.sendMenuRefreshMessage();
|
dictDataProducer.sendDictDataRefreshMessage();
|
||||||
return dictData.getId();
|
return dictData.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,8 +172,8 @@ public class SysDictDataServiceImpl implements SysDictDataService {
|
|||||||
// 更新字典类型
|
// 更新字典类型
|
||||||
SysDictDataDO updateObj = SysDictDataConvert.INSTANCE.convert(reqVO);
|
SysDictDataDO updateObj = SysDictDataConvert.INSTANCE.convert(reqVO);
|
||||||
dictDataMapper.updateById(updateObj);
|
dictDataMapper.updateById(updateObj);
|
||||||
// 发送消息
|
// 发送刷新消息
|
||||||
dictDataProducer.sendMenuRefreshMessage();
|
dictDataProducer.sendDictDataRefreshMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -182,8 +182,8 @@ public class SysDictDataServiceImpl implements SysDictDataService {
|
|||||||
this.checkDictDataExists(id);
|
this.checkDictDataExists(id);
|
||||||
// 删除字典数据
|
// 删除字典数据
|
||||||
dictDataMapper.deleteById(id);
|
dictDataMapper.deleteById(id);
|
||||||
// 发送消息
|
// 发送刷新消息
|
||||||
dictDataProducer.sendMenuRefreshMessage();
|
dictDataProducer.sendDictDataRefreshMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -219,7 +219,7 @@ public class SysMenuServiceImpl implements SysMenuService {
|
|||||||
menuMapper.deleteById(menuId);
|
menuMapper.deleteById(menuId);
|
||||||
// 删除授予给角色的权限
|
// 删除授予给角色的权限
|
||||||
permissionService.processMenuDeleted(menuId);
|
permissionService.processMenuDeleted(menuId);
|
||||||
// 发送刷新消息. 注意,需要事务提交后,在进行发送消息。不然 db 还未提交,结果缓存先刷新了
|
// 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了
|
||||||
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
|
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Loading…
Reference in New Issue
Block a user