diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/config/ConfigurationBeans.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/config/ConfigurationBeans.java index f02884b7a0a90897dba91e560637a855a21dcb8b..1add18babe8644b65c12c196f53ee77c22c2a7e9 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/config/ConfigurationBeans.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/config/ConfigurationBeans.java @@ -1,7 +1,7 @@ package cn.icanci.loopstack.ddk.admin.biz.config; -import cn.icanci.loopstack.ddk.common.client.Client; -import cn.icanci.loopstack.ddk.common.client.http.HttpClientImpl; +import cn.icanci.loopstack.api.client.Client; +import cn.icanci.loopstack.api.client.http.HttpClientImpl; import cn.icanci.loopstack.lsi.event.DefaultEventDispatcher; import cn.icanci.loopstack.lsi.event.EventDispatcher; diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/event/dict/DictEventListener.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/event/dict/DictEventListener.java index 48d20b444c46ebb0cdb0500abf9748511902f692..9efde73a6d72d27364615b886b0321d8cbebc893 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/event/dict/DictEventListener.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/event/dict/DictEventListener.java @@ -1,15 +1,27 @@ package cn.icanci.loopstack.ddk.admin.biz.event.dict; import cn.icanci.loopstack.ddk.admin.biz.service.AppConfigService; +import cn.icanci.loopstack.ddk.admin.biz.service.AppService; import cn.icanci.loopstack.ddk.admin.biz.service.RegisterService; +import cn.icanci.loopstack.ddk.admin.biz.thread.TriggerThread; import cn.icanci.loopstack.ddk.common.model.config.AppConfigVO; +import cn.icanci.loopstack.ddk.common.model.config.AppVO; +import cn.icanci.loopstack.ddk.common.model.config.RegisterVO; +import cn.icanci.loopstack.ddk.common.socket.publish.PublishTypeEnum; +import cn.icanci.loopstack.ddk.common.socket.publish.PublishValueRefreshDTO; +import cn.icanci.loopstack.ddk.common.socket.trigger.TriggerDTO; +import cn.icanci.loopstack.ddk.common.socket.trigger.ValueRefreshTriggerDTO; import cn.icanci.loopstack.lsi.event.BaseEventListener; +import java.util.List; + import javax.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import com.google.common.collect.Lists; + /** * 字典键发布 * @@ -18,7 +30,8 @@ import org.springframework.stereotype.Service; */ @Service public class DictEventListener extends BaseEventListener { - + @Resource + private AppService appService; @Resource private AppConfigService appConfigService; @Resource @@ -31,8 +44,35 @@ public class DictEventListener extends BaseEventListener { return; } AppConfigVO appConfig = appConfigService.queryByUuid(uuid); - if (appConfig == null){ + if (appConfig == null) { return; } + + TriggerThread.trigger(buildTrigger(appConfig)); + } + + /** + * 构建触发对象 + * + * @param appConfig appConfig + * @return 返回触发对象 + */ + private List buildTrigger(AppConfigVO appConfig) { + PublishValueRefreshDTO valueRefresh = new PublishValueRefreshDTO(); + valueRefresh.setKey(appConfig.getAppConfigName()); + valueRefresh.setValue(appConfig.getAppConfigValue()); + ValueRefreshTriggerDTO trigger = new ValueRefreshTriggerDTO(); + trigger.setPublishType(PublishTypeEnum.VALUE_REFRESH); + trigger.setRegisters(queryRegister(appConfig)); + trigger.setValueRefresh(valueRefresh); + return Lists.newArrayList(trigger); + } + + private List queryRegister(AppConfigVO appConfig) { + AppVO appVO = appService.queryByAppUuid(appConfig.getAppUuid()); + if (appVO == null) { + return Lists.newArrayList(); + } + return registerService.queryByAppId(appVO.getAppId()); } } diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/event/resource/ResourceEvent.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/event/resource/ResourceEvent.java index 4af0cb004d5881bdff4e161d41e2306e48364513..b267520b5764aa1c29e41858bd0f5f4fa1bfad46 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/event/resource/ResourceEvent.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/event/resource/ResourceEvent.java @@ -1,9 +1,9 @@ package cn.icanci.loopstack.ddk.admin.biz.event.resource; -import org.springframework.stereotype.Component; - import cn.icanci.loopstack.ddk.admin.biz.event.DdkEvent; +import org.springframework.stereotype.Component; + /** * @author icanci * @since 1.0 Created in 2023/01/09 22:40 diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/event/resource/ResourceEventListener.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/event/resource/ResourceEventListener.java index ae50447b74aedcabf4ed0f63b91a2a54f7408a1e..21ae60d9e61d312e8b39d5ba483533f45421932d 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/event/resource/ResourceEventListener.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/event/resource/ResourceEventListener.java @@ -1,9 +1,28 @@ package cn.icanci.loopstack.ddk.admin.biz.event.resource; +import cn.icanci.loopstack.ddk.admin.biz.service.AppService; +import cn.icanci.loopstack.ddk.admin.biz.service.NoticeConfigService; +import cn.icanci.loopstack.ddk.admin.biz.service.RegisterService; +import cn.icanci.loopstack.ddk.admin.biz.thread.TriggerThread; +import cn.icanci.loopstack.ddk.common.model.config.AppVO; +import cn.icanci.loopstack.ddk.common.model.config.NoticeConfigVO; +import cn.icanci.loopstack.ddk.common.model.config.RegisterVO; +import cn.icanci.loopstack.ddk.common.socket.publish.PublishMethodInvokeDTO; +import cn.icanci.loopstack.ddk.common.socket.publish.PublishTypeEnum; +import cn.icanci.loopstack.ddk.common.socket.trigger.MethodInvokeTriggerDTO; +import cn.icanci.loopstack.ddk.common.socket.trigger.TriggerDTO; import cn.icanci.loopstack.lsi.event.BaseEventListener; +import java.util.List; + +import javax.annotation.Resource; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; +import com.google.common.collect.Lists; + /** * 资源刷新 * @@ -12,9 +31,62 @@ import org.springframework.stereotype.Service; */ @Service public class ResourceEventListener extends BaseEventListener { + @Resource + private AppService appService; + @Resource + private NoticeConfigService noticeConfigService; + @Resource + private RegisterService registerService; @Override protected void event(ResourceEvent event) { + String resource = event.getResource(); + String value = event.getValue(); + if (StringUtils.isBlank(resource) || StringUtils.isBlank(value)) { + return; + } + + List noticeConfigList = noticeConfigService.queryByNoticeConfigResource(resource); + if (CollectionUtils.isEmpty(noticeConfigList)) { + return; + } + + // 执行触发器 + TriggerThread.trigger(buildTrigger(noticeConfigList, resource, value)); + } + + /** + * 构建触发列表 + * + * @param noticeConfigList noticeConfigList + * @param resource 资源 + * @param value 资源值 + * @return 返回触发列表 + */ + private List buildTrigger(List noticeConfigList, String resource, String value) { + List methodInvokes = Lists.newArrayList(); + final PublishMethodInvokeDTO invokeDTO = new PublishMethodInvokeDTO(resource, value); + for (NoticeConfigVO noticeConfigVO : noticeConfigList) { + MethodInvokeTriggerDTO trigger = new MethodInvokeTriggerDTO(); + trigger.setPublishType(PublishTypeEnum.METHOD_INVOKE); + trigger.setRegisters(queryRegister(noticeConfigVO.getAppUuid())); + trigger.setMethodInvoke(invokeDTO); + methodInvokes.add(trigger); + } + return methodInvokes; + } + /** + * 查询注册表 + * + * @param appUuid appUuid + * @return 返回注册表 + */ + private List queryRegister(String appUuid) { + AppVO appVO = appService.queryByAppUuid(appUuid); + if (appVO == null) { + return Lists.newArrayList(); + } + return registerService.queryByAppId(appVO.getAppId()); } } diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/AppService.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/AppService.java index 1b49336d4781efc168b5f9e4bd1de07dfbdcb033..a28ce326ae44eae811a7db31b014ab965483412f 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/AppService.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/AppService.java @@ -18,6 +18,8 @@ public interface AppService { AppVO queryByAppId(String appId); + AppVO queryByAppUuid(String appUuid); + AppVO queryByAppName(String appName); List loadSelector(); diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/RegisterService.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/RegisterService.java index 942f308e6e197348ed2d5a1b51019d66e9a504be..4d63fb0d35f4423bada392d3de9214f3add772fd 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/RegisterService.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/RegisterService.java @@ -16,7 +16,7 @@ public interface RegisterService { /** * 分页查询 - * + * * @param appId appId 注册的id * @param currentPage 当前页 * @param pageSize 当前页数大小 @@ -33,7 +33,7 @@ public interface RegisterService { /** * 资源发布 - * + * * @param resource resource * @param value value */ @@ -41,7 +41,7 @@ public interface RegisterService { /** * 向注册中心注册 - * + * * @param register register * @return boolean */ @@ -49,7 +49,7 @@ public interface RegisterService { /** * 根据AppId加载配置信息 - * + * * @param appId appId * @return 返回配置信息 */ @@ -57,7 +57,7 @@ public interface RegisterService { /** * 查询所有注册信息 - * + * * @return 返回注册信息 */ List queryAll(); @@ -69,4 +69,11 @@ public interface RegisterService { */ void update(RegisterVO register); + /** + * 根据appID查询注册的应用 + * + * @param appId appId + * @return 返回注册列表 + */ + List queryByAppId(String appId); } diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/AppServiceImpl.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/AppServiceImpl.java index 90d4910e0831b7598e0a1799795fbb6c64bf9f32..eac808a94d7a53bac475f6847178e898c3d0e3e1 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/AppServiceImpl.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/AppServiceImpl.java @@ -71,6 +71,12 @@ public class AppServiceImpl extends BaseService implements AppService { return appMapping.do2vo(appDO); } + @Override + public AppVO queryByAppUuid(String appUuid) { + AppDO appDO = appMapper.queryByAppUuid(appUuid, EnvUtils.getEnv()); + return appMapping.do2vo(appDO); + } + @Override public AppVO queryByAppName(String appName) { AppDO appDO = appMapper.queryByAppName(appName, EnvUtils.getEnv()); diff --git a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/RegisterServiceImpl.java b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/RegisterServiceImpl.java index 0e0c079d9cf2be325f618db579f5b625bddf6cb4..80d65c1e02c6569edb4c954f70b2423cbdd5ebd7 100644 --- a/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/RegisterServiceImpl.java +++ b/admin/admin-biz/src/main/java/cn/icanci/loopstack/ddk/admin/biz/service/impl/RegisterServiceImpl.java @@ -173,6 +173,11 @@ public class RegisterServiceImpl implements RegisterService { registerMapper.update(registerMapping.vo2do(register)); } + @Override + public List queryByAppId(String appId) { + return registerMapping.dos2vos(registerMapper.queryByAppId(appId, EnvUtils.getEnv())); + } + private RegisterDO buildRequest(RegisterDTO register) { RegisterDO registerDO = new RegisterDO(); registerDO.setUuid(IDHolder.generateNoBySnowFlake("REG")); diff --git a/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/AppMapper.java b/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/AppMapper.java index d93ceeb24239917c88bd232fca9da90de6584bb2..ff167c045fe5a2d87ee502b7a69836519776d1c7 100644 --- a/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/AppMapper.java +++ b/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/AppMapper.java @@ -60,8 +60,7 @@ public interface AppMapper { * @param appId appId * @param env 环境 **/ - AppDO queryByAppId(@Param("appId") String appId,@Param("env") String env); - + AppDO queryByAppId(@Param("appId") String appId, @Param("env") String env); /** * 根据appName查询 @@ -69,5 +68,13 @@ public interface AppMapper { * @param appName appName * @param env 环境 **/ - AppDO queryByAppName(@Param("appName") String appName,@Param("env") String env); + AppDO queryByAppName(@Param("appName") String appName, @Param("env") String env); + + /** + * 根据appUuid查询 + * + * @param appUuid appUuid + * @param env 环境 + **/ + AppDO queryByAppUuid(@Param("appUuid") String appUuid, @Param("env") String env); } diff --git a/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/RegisterMapper.java b/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/RegisterMapper.java index 753f6401b715c4659d6628ac43ebb71832926b7d..0b60a256e8365b9bae096da343462e31eaafd8f5 100644 --- a/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/RegisterMapper.java +++ b/admin/admin-dal/src/main/java/cn/icanci/loopstack/ddk/admin/dal/mapper/mapper/RegisterMapper.java @@ -68,4 +68,13 @@ public interface RegisterMapper { * @return 返回所有注册信息 */ List selectAll(@Param("env") String env); + + /** + * 根据Appid查询注册信息 + * + * @param appId appId + * @param env env + * @return 返回注册信息 + */ + List queryByAppId(@Param("appId") String appId, @Param("env") String env); } diff --git a/admin/admin-dal/src/main/resources/mybatis/mapper/AppMapper.xml b/admin/admin-dal/src/main/resources/mybatis/mapper/AppMapper.xml index 845fbbc2d165475e0dfcf22762c0e749b71f8fdd..55729bb07d577c8d46fdb9900531d0748e9eb792 100644 --- a/admin/admin-dal/src/main/resources/mybatis/mapper/AppMapper.xml +++ b/admin/admin-dal/src/main/resources/mybatis/mapper/AppMapper.xml @@ -249,4 +249,11 @@ WHERE `app_name` = #{appName} and `env` = #{env} + + \ No newline at end of file diff --git a/admin/admin-dal/src/main/resources/mybatis/mapper/RegisterMapper.xml b/admin/admin-dal/src/main/resources/mybatis/mapper/RegisterMapper.xml index 2b62058b4ca83804792d476d27bd3a7c3f1363fd..43d8ce183cc90ea7100553ff318715c6d82e6e49 100644 --- a/admin/admin-dal/src/main/resources/mybatis/mapper/RegisterMapper.xml +++ b/admin/admin-dal/src/main/resources/mybatis/mapper/RegisterMapper.xml @@ -256,4 +256,10 @@ FROM ddk_register where `env` = #{env} + \ No newline at end of file diff --git a/client/pom.xml b/client/pom.xml index 2163e13d41157e536ef271ca01d4ef1001d9218b..116a7cc82084330a00684cbc43fdd5e86a8c3297 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -58,5 +58,9 @@ io.netty netty-all + + cn.icanci.loopstack + lsi-api + \ No newline at end of file diff --git a/client/src/main/java/cn/icanci/loopstack/ddk/client/exception/NoSuchAuthValidatorException.java b/client/src/main/java/cn/icanci/loopstack/ddk/client/exception/NoSuchAuthValidatorException.java new file mode 100644 index 0000000000000000000000000000000000000000..19b5b71d2053bd50369602305f67d7a892271507 --- /dev/null +++ b/client/src/main/java/cn/icanci/loopstack/ddk/client/exception/NoSuchAuthValidatorException.java @@ -0,0 +1,26 @@ +package cn.icanci.loopstack.ddk.client.exception; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/07 16:23 + */ +public class NoSuchAuthValidatorException extends RuntimeException { + public NoSuchAuthValidatorException() { + } + + public NoSuchAuthValidatorException(String message) { + super(message); + } + + public NoSuchAuthValidatorException(String message, Throwable cause) { + super(message, cause); + } + + public NoSuchAuthValidatorException(Throwable cause) { + super(cause); + } + + public NoSuchAuthValidatorException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/client/src/main/java/cn/icanci/loopstack/ddk/client/exception/ServerOfflineException.java b/client/src/main/java/cn/icanci/loopstack/ddk/client/exception/ServerOfflineException.java new file mode 100644 index 0000000000000000000000000000000000000000..2cc5a76759656ace92fece4bd9a79a07aebfb97c --- /dev/null +++ b/client/src/main/java/cn/icanci/loopstack/ddk/client/exception/ServerOfflineException.java @@ -0,0 +1,28 @@ +package cn.icanci.loopstack.ddk.client.exception; + +/** + * 服务不在线异常 + * + * @author icanci + * @since 1.0 Created in 2023/01/07 16:23 + */ +public class ServerOfflineException extends RuntimeException { + public ServerOfflineException() { + } + + public ServerOfflineException(String message) { + super(message); + } + + public ServerOfflineException(String message, Throwable cause) { + super(message, cause); + } + + public ServerOfflineException(Throwable cause) { + super(cause); + } + + public ServerOfflineException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/DdkRepositoryHolder.java b/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/DdkRepositoryHolder.java index 368161dd2d38ba462b006b1b67b8d535100fcf92..88d7a9c714cc5d6d92e3569f03b5cb15665fdd0f 100644 --- a/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/DdkRepositoryHolder.java +++ b/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/DdkRepositoryHolder.java @@ -1,14 +1,31 @@ package cn.icanci.loopstack.ddk.client.repository; -import cn.icanci.loopstack.ddk.common.client.Client; -import cn.icanci.loopstack.ddk.common.client.http.HttpClientImpl; +import cn.hutool.http.Method; +import cn.hutool.json.JSONUtil; +import cn.icanci.loopstack.api.client.Client; +import cn.icanci.loopstack.api.client.http.HttpClientImpl; +import cn.icanci.loopstack.ddk.client.exception.ServerOfflineException; +import cn.icanci.loopstack.ddk.client.properties.DdkProperties; +import cn.icanci.loopstack.ddk.common.result.R; +import cn.icanci.loopstack.ddk.common.socket.UriConstant; +import cn.icanci.loopstack.ddk.common.socket.load.ResourceLoadRequestDTO; +import cn.icanci.loopstack.ddk.common.socket.load.ResourceLoadResponseDTO; import cn.icanci.loopstack.ddk.common.socket.publish.PublishValueRefreshDTO; +import io.netty.util.internal.ThrowableUtil; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Service; +import com.google.common.collect.Maps; + /** * DdkRepositoryHolder * 本地仓储缓存器 @@ -18,16 +35,44 @@ import org.springframework.stereotype.Service; */ @Service public class DdkRepositoryHolder implements InitializingBean { - private static final Logger logger = LoggerFactory.getLogger(DdkRepositoryHolder.class); - private static final Client CLIENT = HttpClientImpl.getInstance(); + private static final Logger logger = LoggerFactory.getLogger(DdkRepositoryHolder.class); + + private static final Client CLIENT = HttpClientImpl.getInstance(); - // 字段map + @Resource + private DdkProperties ddkProperties; - // 方法map + /** + * http://{address}:port+UriConstant.ToClient.LOAD + */ + private static final String INVOKE_REQUEST_FORMAT = "http://%s:%s" + UriConstant.ToServer.LOAD; + /** + * 字段map + * key: 配置key + * value: FieldHolder + */ + private static final Map FIELD_MAP = new ConcurrentHashMap<>(); + + /** + * 方法map + * key: resource + * value: MethodHolder + */ + private static final Map METHOD_MAP = new ConcurrentHashMap<>(); @Override public void afterPropertiesSet() throws Exception { + // 1.加载缓存 + toRefreshCache(); + // 2.加载数据 + toLoad(); + } + + /** + * 加载缓存Map + */ + private void toRefreshCache() { } @@ -37,16 +82,58 @@ public class DdkRepositoryHolder implements InitializingBean { * 2、加载字段数据,构建map * 3、调用缓存方法 */ - public synchronized void load() { + private void toLoad() { + // 加载配置数据 + ResourceLoadResponseDTO response = loadConfigs(); + // 数据权限验证 + authValidator(response); } + /** + * 加载远程数据 + */ + private ResourceLoadResponseDTO loadConfigs() { + String serverIps = ddkProperties.getServerIps(); + int serverPort = ddkProperties.getServerPort(); + String appId = ddkProperties.getAppId(); + String[] serverAddress = serverIps.split(","); + for (String address : serverAddress) { + try { + String reqUrl = String.format(INVOKE_REQUEST_FORMAT, address, serverPort); + + ResourceLoadRequestDTO requestDTO = new ResourceLoadRequestDTO(); + requestDTO.setAppId(appId); + + Client.RpcRequest rpcRequest = new Client.RpcRequest(reqUrl, requestDTO, Maps.newHashMap(), Method.POST, 3, TimeUnit.SECONDS, 3); + + R call = CLIENT.call(rpcRequest, R.class); + + logger.info("[DdkRepositoryHolder][call] Load result:{}", JSONUtil.toJsonStr(call)); + + return JSONUtil.toBean(call.getData().get("response").toString(), ResourceLoadResponseDTO.class); + } catch (Exception ex) { + logger.error("[DdkRepositoryHolder][call] Ex error message:{}", ThrowableUtil.stackTraceToString(ex)); + } + } + throw new ServerOfflineException("All Server IP are Requested, and All failed!!! Please Check your Config, The Server IPs are: " + serverIps); + } + + /** + * 权限验证 + * + * @param response response + */ + private void authValidator(ResourceLoadResponseDTO response) { + } + /** * 刷新缓存数据 * * @param publish publish */ public synchronized void refresh(PublishValueRefreshDTO publish) { + } /** diff --git a/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/FieldHolder.java b/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/FieldHolder.java new file mode 100644 index 0000000000000000000000000000000000000000..9ddb115ddfd1615c151733959e4b0963f11f8935 --- /dev/null +++ b/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/FieldHolder.java @@ -0,0 +1,82 @@ +package cn.icanci.loopstack.ddk.client.repository; + +import java.lang.reflect.Field; +import java.util.Objects; +import java.util.StringJoiner; + +/** + * 字段持有者 + * + * @author icanci + * @since 1.0 Created in 2023/01/13 23:41 + */ +public class FieldHolder { + /** + * 字段 + */ + private Field field; + /** + * 字段类型 + */ + private Class fieldClass; + /** + * 字段值:显示值,非实际值 + */ + private String value; + /** + * 字段对应的对象 + */ + private Object bean; + + public Field getField() { + return field; + } + + public void setField(Field field) { + this.field = field; + } + + public Class getFieldClass() { + return fieldClass; + } + + public void setFieldClass(Class fieldClass) { + this.fieldClass = fieldClass; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public Object getBean() { + return bean; + } + + public void setBean(Object bean) { + this.bean = bean; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + FieldHolder that = (FieldHolder) o; + return Objects.equals(field, that.field) && Objects.equals(fieldClass, that.fieldClass) && Objects.equals(value, that.value) && Objects.equals(bean, that.bean); + } + + @Override + public int hashCode() { + return Objects.hash(field, fieldClass, value, bean); + } + + @Override + public String toString() { + return new StringJoiner(",").add("field=" + field).add("fieldClass=" + fieldClass).add("value=" + value).add("bean=" + bean).toString(); + } +} diff --git a/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/MethodHolder.java b/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/MethodHolder.java new file mode 100644 index 0000000000000000000000000000000000000000..9502069b67d7449690a98421716d1d68fa973a79 --- /dev/null +++ b/client/src/main/java/cn/icanci/loopstack/ddk/client/repository/MethodHolder.java @@ -0,0 +1,122 @@ +package cn.icanci.loopstack.ddk.client.repository; + +import java.lang.reflect.Method; +import java.util.Objects; +import java.util.StringJoiner; + +/** + * @author icanci + * @since 1.0 Created in 2023/01/13 23:45 + */ +public class MethodHolder { + /** + * 资源名称 + */ + private String resource; + /** + * 资源上次刷新值 + */ + private String value; + /** + * 资源对应的方法,使用 @DdkBeforeCall 标记的方法 + * 其中需要传参数,值为String类型 + */ + private Method beforeMethodCall; + /** + * 资源对应的方法,使用 @DdkCall 标记的方法 + * 其中需要传参数,值为String类型 + */ + private Method methodCall; + /** + * 资源对应的方法,使用 @DdkAfterCall 标记的方法 + * 其中需要传参数,值为String类型 + */ + private Method afterMethodCall; + /** + * 资源对应的类 + */ + private Class clazz; + /** + * 资源对应的SpringBean对象 + */ + private Object bean; + + public String getResource() { + return resource; + } + + public void setResource(String resource) { + this.resource = resource; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public Method getBeforeMethodCall() { + return beforeMethodCall; + } + + public void setBeforeMethodCall(Method beforeMethodCall) { + this.beforeMethodCall = beforeMethodCall; + } + + public Method getMethodCall() { + return methodCall; + } + + public void setMethodCall(Method methodCall) { + this.methodCall = methodCall; + } + + public Method getAfterMethodCall() { + return afterMethodCall; + } + + public void setAfterMethodCall(Method afterMethodCall) { + this.afterMethodCall = afterMethodCall; + } + + public Class getClazz() { + return clazz; + } + + public void setClazz(Class clazz) { + this.clazz = clazz; + } + + public Object getBean() { + return bean; + } + + public void setBean(Object bean) { + this.bean = bean; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + MethodHolder that = (MethodHolder) o; + return Objects.equals(resource, that.resource) && Objects.equals(value, that.value) && Objects.equals(beforeMethodCall, that.beforeMethodCall) + && Objects.equals(methodCall, that.methodCall) && Objects.equals(afterMethodCall, that.afterMethodCall) && Objects.equals(clazz, that.clazz) + && Objects.equals(bean, that.bean); + } + + @Override + public int hashCode() { + return Objects.hash(resource, value, beforeMethodCall, methodCall, afterMethodCall, clazz, bean); + } + + @Override + public String toString() { + return new StringJoiner(",").add("resource=" + resource).add("value=" + value).add("beforeMethodCall=" + beforeMethodCall).add("methodCall=" + methodCall) + .add("afterMethodCall=" + afterMethodCall).add("clazz=" + clazz).add("bean=" + bean).toString(); + } +} diff --git a/client/src/main/java/cn/icanci/loopstack/ddk/client/server/RegisterServer.java b/client/src/main/java/cn/icanci/loopstack/ddk/client/server/RegisterServer.java index 2b92efbdf508d7f39e6e7b4c0e77d22f635a3d7d..5decb031951849ed203a3e18555173a3b5e1ec9a 100644 --- a/client/src/main/java/cn/icanci/loopstack/ddk/client/server/RegisterServer.java +++ b/client/src/main/java/cn/icanci/loopstack/ddk/client/server/RegisterServer.java @@ -2,10 +2,9 @@ package cn.icanci.loopstack.ddk.client.server; import cn.hutool.http.Method; import cn.hutool.json.JSONUtil; +import cn.icanci.loopstack.api.client.Client; +import cn.icanci.loopstack.api.client.http.HttpClientImpl; import cn.icanci.loopstack.ddk.client.properties.DdkProperties; -import cn.icanci.loopstack.ddk.common.client.Client; -import cn.icanci.loopstack.ddk.common.client.RemoteException; -import cn.icanci.loopstack.ddk.common.client.http.HttpClientImpl; import cn.icanci.loopstack.ddk.common.result.R; import cn.icanci.loopstack.ddk.common.socket.UriConstant; import cn.icanci.loopstack.ddk.common.socket.publish.RegisterDTO; @@ -73,7 +72,7 @@ public class RegisterServer implements InitializingBean { } else { logger.error("Task Register Exception:{}", r.getMessage()); } - } catch (RemoteException | ExecutionException | InterruptedException | TimeoutException e) { + } catch (ExecutionException | InterruptedException | TimeoutException e) { logger.warn("Register Exception:{}", e.getMessage()); } } diff --git a/common/src/main/java/cn/icanci/loopstack/ddk/common/anno/DdkValue.java b/common/src/main/java/cn/icanci/loopstack/ddk/common/anno/DdkValue.java index 11f5571181f5190fdc58e88fc9ba2802566ef973..387e064a6150f35bf12aa33c1eac067057dcef87 100644 --- a/common/src/main/java/cn/icanci/loopstack/ddk/common/anno/DdkValue.java +++ b/common/src/main/java/cn/icanci/loopstack/ddk/common/anno/DdkValue.java @@ -16,6 +16,7 @@ import java.lang.annotation.Target; public @interface DdkValue { /** * 配置字典值 + * 支持注入的类型:String、Integer(int)、Long(long)、Double(double)、Float(float)、BigDecimal * * @return 返回配置字典值 */ diff --git a/common/src/main/java/cn/icanci/loopstack/ddk/common/socket/publish/PublishMethodInvokeDTO.java b/common/src/main/java/cn/icanci/loopstack/ddk/common/socket/publish/PublishMethodInvokeDTO.java index cb0fcac9f58c6b23ee0276bf983a6ded6fe6eda2..7775a37800d6e6dc29ca0b5b9d4227b0ee367249 100644 --- a/common/src/main/java/cn/icanci/loopstack/ddk/common/socket/publish/PublishMethodInvokeDTO.java +++ b/common/src/main/java/cn/icanci/loopstack/ddk/common/socket/publish/PublishMethodInvokeDTO.java @@ -18,6 +18,14 @@ public class PublishMethodInvokeDTO implements Serializable { */ private String noticeValue; + public PublishMethodInvokeDTO() { + } + + public PublishMethodInvokeDTO(String noticeResource, String noticeValue) { + this.noticeResource = noticeResource; + this.noticeValue = noticeValue; + } + public String getNoticeResource() { return noticeResource; }