mirror of
https://gitee.com/dolphinscheduler/DolphinScheduler.git
synced 2024-11-29 18:58:05 +08:00
Remove spring cache for dao (#15184)
This commit is contained in:
parent
9c7ad6df0a
commit
1d23e4fe5d
@ -1,42 +0,0 @@
|
||||
# Cache
|
||||
|
||||
## Purpose
|
||||
|
||||
Due to the large database read operations during the master-server scheduling process. Such as read tables like `tenant`, `user`, `processDefinition`, etc. Operations stress read pressure to the DB, and slow down the entire core scheduling process.
|
||||
|
||||
By considering this part of the business data is a high-read and low-write scenario, a cache module is introduced to reduce the DB read pressure and speed up the core scheduling process.
|
||||
|
||||
## Cache Settings
|
||||
|
||||
```yaml
|
||||
spring:
|
||||
cache:
|
||||
# default disable cache, you can enable by `type: caffeine`
|
||||
type: none
|
||||
cache-names:
|
||||
- tenant
|
||||
- user
|
||||
- processDefinition
|
||||
- processTaskRelation
|
||||
- taskDefinition
|
||||
caffeine:
|
||||
spec: maximumSize=100,expireAfterWrite=300s,recordStats
|
||||
```
|
||||
|
||||
The cache module uses [spring-cache](https://spring.io/guides/gs/caching/), so you can set cache config like whether to enable cache (`none` to disable by default), cache types in the spring `application.yaml` directly.
|
||||
|
||||
Currently, implements the config of [caffeine](https://github.com/ben-manes/caffeine), you can assign cache configs like cache size, expire time, etc.
|
||||
|
||||
## Cache Read
|
||||
|
||||
The cache module adopts the `@Cacheable` annotation from spring-cache and you can annotate the annotation in the related mapper layer. Refer to the `TenantMapper`.
|
||||
|
||||
## Cache Evict
|
||||
|
||||
The business data updates come from the api-server, and the cache side is in the master-server. Then it is necessary to monitor the data updates from the api-server (use aspect point cut interceptor `@CacheEvict`), and notify the master-server of `cacheEvictCommand` when processing a cache eviction.
|
||||
|
||||
Note: the final strategy for cache update comes from the expiration strategy configuration in caffeine, therefore configure it under the business scenarios;
|
||||
|
||||
The sequence diagram shows below:
|
||||
|
||||
<img src="../../../img/cache-evict.png" alt="cache-evict" style="zoom: 67%;" />
|
@ -1,42 +0,0 @@
|
||||
### 缓存
|
||||
|
||||
#### 缓存目的
|
||||
|
||||
由于在master-server调度过程中,会产生大量的数据库读取操作,如tenant,user,processDefinition等,一方面对DB产生很大的读压力,另一方面则会使整个核心调度流程变得缓慢;
|
||||
|
||||
考虑到这部分业务数据是读多写少的场景,故引入了缓存模块,以减少DB读压力,加快核心调度流程;
|
||||
|
||||
#### 缓存设置
|
||||
|
||||
```yaml
|
||||
spring:
|
||||
cache:
|
||||
# default enable cache, you can disable by `type: none`
|
||||
type: none
|
||||
cache-names:
|
||||
- tenant
|
||||
- user
|
||||
- processDefinition
|
||||
- processTaskRelation
|
||||
- taskDefinition
|
||||
caffeine:
|
||||
spec: maximumSize=100,expireAfterWrite=300s,recordStats
|
||||
```
|
||||
|
||||
缓存模块采用[spring-cache](https://spring.io/guides/gs/caching/)机制,可直接在spring配置文件中配置是否开启缓存(默认`none`关闭), 缓存类型;
|
||||
|
||||
目前采用[caffeine](https://github.com/ben-manes/caffeine)进行缓存管理,可自由设置缓存相关配置,如缓存大小、过期时间等;
|
||||
|
||||
#### 缓存读取
|
||||
|
||||
缓存采用spring-cache的注解,配置在相关的mapper层,可参考如:`TenantMapper`.
|
||||
|
||||
#### 缓存更新
|
||||
|
||||
业务数据的更新来自于api-server, 而缓存端在master-server, 故需要对api-server的数据更新做监听(aspect切面拦截`@CacheEvict`),当需要进行缓存驱逐时会通知master-server,master-server接收到cacheEvictCommand后进行缓存驱逐;
|
||||
|
||||
需要注意的是:缓存更新的兜底策略来自于用户在caffeine中的过期策略配置,请结合业务进行配置;
|
||||
|
||||
时序图如下图所示:
|
||||
|
||||
<img src="../../../img/cache-evict.png" alt="cache-evict" style="zoom: 67%;" />
|
@ -1,159 +0,0 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.api.aspect;
|
||||
|
||||
import org.apache.dolphinscheduler.common.enums.CacheType;
|
||||
import org.apache.dolphinscheduler.common.model.Server;
|
||||
import org.apache.dolphinscheduler.extract.base.client.SingletonJdkDynamicRpcClientProxyFactory;
|
||||
import org.apache.dolphinscheduler.extract.master.IMasterCacheService;
|
||||
import org.apache.dolphinscheduler.extract.master.transportor.CacheExpireRequest;
|
||||
import org.apache.dolphinscheduler.registry.api.RegistryClient;
|
||||
import org.apache.dolphinscheduler.registry.api.enums.RegistryNodeType;
|
||||
import org.apache.dolphinscheduler.service.cache.impl.CacheKeyGenerator;
|
||||
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.aspectj.lang.annotation.Around;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.aspectj.lang.annotation.Pointcut;
|
||||
import org.aspectj.lang.reflect.MethodSignature;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.cache.annotation.CacheConfig;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.expression.EvaluationContext;
|
||||
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
||||
import org.springframework.expression.spel.support.StandardEvaluationContext;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* aspect for cache evict
|
||||
*/
|
||||
@Aspect
|
||||
@Component
|
||||
@Slf4j
|
||||
public class CacheEvictAspect {
|
||||
|
||||
/**
|
||||
* symbol of spring el
|
||||
*/
|
||||
private static final String EL_SYMBOL = "#";
|
||||
|
||||
/**
|
||||
* prefix of spring el
|
||||
*/
|
||||
private static final String P = "p";
|
||||
|
||||
@Autowired
|
||||
private CacheKeyGenerator cacheKeyGenerator;
|
||||
|
||||
@Autowired
|
||||
private RegistryClient registryClient;
|
||||
|
||||
@Pointcut("@annotation(org.springframework.cache.annotation.CacheEvict)")
|
||||
public void cacheEvictPointCut() {
|
||||
// Do nothing because of it's a pointcut
|
||||
}
|
||||
|
||||
@Around("cacheEvictPointCut()")
|
||||
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
|
||||
MethodSignature sign = (MethodSignature) proceedingJoinPoint.getSignature();
|
||||
Method method = sign.getMethod();
|
||||
Object target = proceedingJoinPoint.getTarget();
|
||||
Object[] args = proceedingJoinPoint.getArgs();
|
||||
|
||||
Object result = proceedingJoinPoint.proceed();
|
||||
|
||||
CacheConfig cacheConfig = method.getDeclaringClass().getAnnotation(CacheConfig.class);
|
||||
CacheEvict cacheEvict = method.getAnnotation(CacheEvict.class);
|
||||
|
||||
CacheType cacheType = getCacheType(cacheConfig, cacheEvict);
|
||||
if (cacheType != null) {
|
||||
String cacheKey;
|
||||
if (cacheEvict.key().isEmpty()) {
|
||||
cacheKey = (String) cacheKeyGenerator.generate(target, method, args);
|
||||
} else {
|
||||
cacheKey = cacheEvict.key();
|
||||
if (cacheEvict.key().contains(EL_SYMBOL)) {
|
||||
cacheKey = parseKey(cacheEvict.key(), Arrays.asList(args));
|
||||
}
|
||||
}
|
||||
if (StringUtils.isNotEmpty(cacheKey)) {
|
||||
notifyMaster(cacheType, cacheKey);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private CacheType getCacheType(CacheConfig cacheConfig, CacheEvict cacheEvict) {
|
||||
String cacheName = null;
|
||||
if (cacheEvict.cacheNames().length > 0) {
|
||||
cacheName = cacheEvict.cacheNames()[0];
|
||||
}
|
||||
if (cacheConfig.cacheNames().length > 0) {
|
||||
cacheName = cacheConfig.cacheNames()[0];
|
||||
}
|
||||
if (cacheName == null) {
|
||||
return null;
|
||||
}
|
||||
for (CacheType cacheType : CacheType.values()) {
|
||||
if (cacheType.getCacheName().equals(cacheName)) {
|
||||
return cacheType;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String parseKey(String key, List<Object> paramList) {
|
||||
SpelExpressionParser spelParser = new SpelExpressionParser();
|
||||
EvaluationContext ctx = new StandardEvaluationContext();
|
||||
for (int i = 0; i < paramList.size(); i++) {
|
||||
ctx.setVariable(P + i, paramList.get(i));
|
||||
}
|
||||
Object obj = spelParser.parseExpression(key).getValue(ctx);
|
||||
if (null == obj) {
|
||||
throw new RuntimeException("parseKey error");
|
||||
}
|
||||
return obj.toString();
|
||||
}
|
||||
|
||||
private void notifyMaster(CacheType cacheType, String cacheKey) {
|
||||
try {
|
||||
List<Server> serverList = registryClient.getServerList(RegistryNodeType.MASTER);
|
||||
if (CollectionUtils.isEmpty(serverList)) {
|
||||
return;
|
||||
}
|
||||
for (Server server : serverList) {
|
||||
IMasterCacheService masterCacheService = SingletonJdkDynamicRpcClientProxyFactory
|
||||
.getProxyClient(server.getHost() + ":" + server.getPort(), IMasterCacheService.class);
|
||||
masterCacheService.cacheExpire(new CacheExpireRequest(cacheType, cacheKey));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("notify master error", e);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -28,17 +28,12 @@ import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.cache.annotation.CacheConfig;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
|
||||
/**
|
||||
* process definition mapper interface
|
||||
*/
|
||||
@CacheConfig(cacheNames = "processDefinition", keyGenerator = "cacheKeyGenerator")
|
||||
public interface ProcessDefinitionMapper extends BaseMapper<ProcessDefinition> {
|
||||
|
||||
/**
|
||||
@ -47,13 +42,11 @@ public interface ProcessDefinitionMapper extends BaseMapper<ProcessDefinition> {
|
||||
* @param code code
|
||||
* @return process definition
|
||||
*/
|
||||
@Cacheable(sync = true)
|
||||
ProcessDefinition queryByCode(@Param("code") long code);
|
||||
|
||||
/**
|
||||
* update
|
||||
*/
|
||||
@CacheEvict(key = "#p0.code")
|
||||
int updateById(@Param("et") ProcessDefinition processDefinition);
|
||||
|
||||
/**
|
||||
@ -62,7 +55,6 @@ public interface ProcessDefinitionMapper extends BaseMapper<ProcessDefinition> {
|
||||
* @param code code
|
||||
* @return delete result
|
||||
*/
|
||||
@CacheEvict
|
||||
int deleteByCode(@Param("code") long code);
|
||||
|
||||
/**
|
||||
|
@ -25,17 +25,12 @@ import org.apache.ibatis.annotations.Param;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.cache.annotation.CacheConfig;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
|
||||
/**
|
||||
* process task relation mapper interface
|
||||
*/
|
||||
@CacheConfig(cacheNames = "processTaskRelation", keyGenerator = "cacheKeyGenerator")
|
||||
public interface ProcessTaskRelationMapper extends BaseMapper<ProcessTaskRelation> {
|
||||
|
||||
/**
|
||||
@ -44,13 +39,11 @@ public interface ProcessTaskRelationMapper extends BaseMapper<ProcessTaskRelatio
|
||||
* @param processCode processCode
|
||||
* @return ProcessTaskRelation list
|
||||
*/
|
||||
@Cacheable(unless = "#result == null || #result.size() == 0")
|
||||
List<ProcessTaskRelation> queryByProcessCode(@Param("processCode") long processCode);
|
||||
|
||||
/**
|
||||
* update
|
||||
*/
|
||||
@CacheEvict(key = "#p0.projectCode + '_' + #p0.processDefinitionCode")
|
||||
int updateById(@Param("et") ProcessTaskRelation processTaskRelation);
|
||||
|
||||
/**
|
||||
@ -60,7 +53,6 @@ public interface ProcessTaskRelationMapper extends BaseMapper<ProcessTaskRelatio
|
||||
* @param processCode processCode
|
||||
* @return int
|
||||
*/
|
||||
@CacheEvict
|
||||
int deleteByCode(@Param("projectCode") long projectCode, @Param("processCode") long processCode);
|
||||
|
||||
/**
|
||||
|
@ -23,23 +23,16 @@ import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.cache.annotation.CacheConfig;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
|
||||
/**
|
||||
* scheduler mapper interface
|
||||
*/
|
||||
@CacheConfig(cacheNames = "schedule", keyGenerator = "cacheKeyGenerator")
|
||||
public interface ScheduleMapper extends BaseMapper<Schedule> {
|
||||
|
||||
@CacheEvict(key = "#p0.processDefinitionCode")
|
||||
int insert(Schedule entity);
|
||||
|
||||
@CacheEvict(key = "#p0.processDefinitionCode")
|
||||
int updateById(@Param("et") Schedule entity);
|
||||
|
||||
/**
|
||||
@ -48,7 +41,6 @@ public interface ScheduleMapper extends BaseMapper<Schedule> {
|
||||
* @param processDefinitionCode processDefinitionCode
|
||||
* @return schedule list
|
||||
*/
|
||||
@Cacheable(sync = true)
|
||||
List<Schedule> queryReleaseSchedulerListByProcessDefinitionCode(@Param("processDefinitionCode") long processDefinitionCode);
|
||||
|
||||
/**
|
||||
|
@ -26,10 +26,6 @@ import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.cache.annotation.CacheConfig;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
@ -37,7 +33,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
/**
|
||||
* task definition log mapper interface
|
||||
*/
|
||||
@CacheConfig(cacheNames = "taskDefinition", keyGenerator = "cacheKeyGenerator")
|
||||
public interface TaskDefinitionLogMapper extends BaseMapper<TaskDefinitionLog> {
|
||||
|
||||
/**
|
||||
@ -47,13 +42,11 @@ public interface TaskDefinitionLogMapper extends BaseMapper<TaskDefinitionLog> {
|
||||
* @param version version
|
||||
* @return task definition log
|
||||
*/
|
||||
@Cacheable(sync = true)
|
||||
TaskDefinitionLog queryByDefinitionCodeAndVersion(@Param("code") long code, @Param("version") int version);
|
||||
|
||||
/**
|
||||
* update
|
||||
*/
|
||||
@CacheEvict(key = "#p0.code + '_' + #p0.version")
|
||||
int updateById(@Param("et") TaskDefinitionLog taskDefinitionLog);
|
||||
|
||||
/**
|
||||
@ -63,7 +56,6 @@ public interface TaskDefinitionLogMapper extends BaseMapper<TaskDefinitionLog> {
|
||||
* @param version task definition version
|
||||
* @return delete result
|
||||
*/
|
||||
@CacheEvict
|
||||
int deleteByCodeAndVersion(@Param("code") long code, @Param("version") int version);
|
||||
|
||||
/**
|
||||
|
@ -23,10 +23,6 @@ import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.cache.annotation.CacheConfig;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
@ -34,7 +30,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
/**
|
||||
* tenant mapper interface
|
||||
*/
|
||||
@CacheConfig(cacheNames = "tenant", keyGenerator = "cacheKeyGenerator")
|
||||
public interface TenantMapper extends BaseMapper<Tenant> {
|
||||
|
||||
/**
|
||||
@ -43,19 +38,16 @@ public interface TenantMapper extends BaseMapper<Tenant> {
|
||||
* @param tenantId tenantId
|
||||
* @return tenant
|
||||
*/
|
||||
@Cacheable(sync = true)
|
||||
Tenant queryById(@Param("tenantId") int tenantId);
|
||||
|
||||
/**
|
||||
* delete by id
|
||||
*/
|
||||
@CacheEvict
|
||||
int deleteById(int id);
|
||||
|
||||
/**
|
||||
* update
|
||||
*/
|
||||
@CacheEvict(key = "#p0.id")
|
||||
int updateById(@Param("et") Tenant tenant);
|
||||
|
||||
/**
|
||||
|
@ -25,10 +25,6 @@ import org.apache.ibatis.annotations.Param;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.cache.annotation.CacheConfig;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
@ -36,25 +32,21 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
/**
|
||||
* user mapper interface
|
||||
*/
|
||||
@CacheConfig(cacheNames = "user", keyGenerator = "cacheKeyGenerator")
|
||||
public interface UserMapper extends BaseMapper<User> {
|
||||
|
||||
/**
|
||||
* select by user id
|
||||
*/
|
||||
@Cacheable(sync = true)
|
||||
User selectById(int id);
|
||||
|
||||
/**
|
||||
* delete by id
|
||||
*/
|
||||
@CacheEvict
|
||||
int deleteById(int id);
|
||||
|
||||
/**
|
||||
* update
|
||||
*/
|
||||
@CacheEvict(key = "#p0.id")
|
||||
int updateById(@Param("et") User user);
|
||||
|
||||
/**
|
||||
|
@ -17,24 +17,17 @@
|
||||
|
||||
package org.apache.dolphinscheduler.dao.mapper;
|
||||
|
||||
import static org.apache.dolphinscheduler.common.constants.Constants.CACHE_KEY_VALUE_ALL;
|
||||
|
||||
import org.apache.dolphinscheduler.dao.entity.WorkerGroup;
|
||||
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.cache.annotation.CacheConfig;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.cache.annotation.Cacheable;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* worker group mapper interface
|
||||
*/
|
||||
@CacheConfig(cacheNames = "workerGroup", keyGenerator = "cacheKeyGenerator")
|
||||
public interface WorkerGroupMapper extends BaseMapper<WorkerGroup> {
|
||||
|
||||
/**
|
||||
@ -42,16 +35,12 @@ public interface WorkerGroupMapper extends BaseMapper<WorkerGroup> {
|
||||
*
|
||||
* @return worker group list
|
||||
*/
|
||||
@Cacheable(sync = true, key = CACHE_KEY_VALUE_ALL)
|
||||
List<WorkerGroup> queryAllWorkerGroup();
|
||||
|
||||
@CacheEvict(key = CACHE_KEY_VALUE_ALL)
|
||||
int deleteById(Integer id);
|
||||
|
||||
@CacheEvict(key = CACHE_KEY_VALUE_ALL)
|
||||
int insert(WorkerGroup entity);
|
||||
|
||||
@CacheEvict(key = CACHE_KEY_VALUE_ALL)
|
||||
int updateById(@Param("et") WorkerGroup entity);
|
||||
|
||||
/**
|
||||
|
@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.extract.master;
|
||||
|
||||
import org.apache.dolphinscheduler.extract.base.RpcMethod;
|
||||
import org.apache.dolphinscheduler.extract.base.RpcService;
|
||||
import org.apache.dolphinscheduler.extract.master.transportor.CacheExpireRequest;
|
||||
|
||||
@RpcService
|
||||
public interface IMasterCacheService {
|
||||
|
||||
@RpcMethod
|
||||
void cacheExpire(CacheExpireRequest cacheExpireRequest);
|
||||
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.extract.master.transportor;
|
||||
|
||||
import org.apache.dolphinscheduler.common.enums.CacheType;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class CacheExpireRequest {
|
||||
|
||||
private CacheType cacheType;
|
||||
private String cacheKey;
|
||||
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.apache.dolphinscheduler.server.master.rpc;
|
||||
|
||||
import org.apache.dolphinscheduler.common.enums.CacheType;
|
||||
import org.apache.dolphinscheduler.extract.master.IMasterCacheService;
|
||||
import org.apache.dolphinscheduler.extract.master.transportor.CacheExpireRequest;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.cache.Cache;
|
||||
import org.springframework.cache.CacheManager;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class MasterCacheServiceImpl implements IMasterCacheService {
|
||||
|
||||
@Autowired
|
||||
private CacheManager cacheManager;
|
||||
|
||||
@Override
|
||||
public void cacheExpire(CacheExpireRequest cacheExpireRequest) {
|
||||
if (cacheExpireRequest.getCacheKey().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
CacheType cacheType = cacheExpireRequest.getCacheType();
|
||||
Cache cache = cacheManager.getCache(cacheType.getCacheName());
|
||||
if (cache != null) {
|
||||
cache.evict(cacheExpireRequest.getCacheKey());
|
||||
log.info("cache evict, type:{}, key:{}", cacheType.getCacheName(), cacheExpireRequest.getCacheKey());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user