From 90471d42c503da8e12db44074331ea027526d04e Mon Sep 17 00:00:00 2001 From: icanci Date: Sat, 26 Nov 2022 11:34:02 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../biz/service/impl/BaseDataServiceImpl.java | 11 ++-- .../service/impl/DataSourceServiceImpl.java | 5 +- .../biz/service/impl/StrategyServiceImpl.java | 37 ++++++------- .../src/main/resources/application.yml | 11 ++-- rec-core/src/main/resources/application.yml | 2 +- .../engine/script/RecScriptEngineManager.java | 7 ++- .../engine/sdk/RecEngineSDKAutoConfig.java | 54 +++---------------- .../sdk/condition/AbstractCondition.java | 5 +- .../engine/sdk/properties/RecProperties.java | 24 ++++++--- .../rec/engine/sdk/rule/EngineExecutor.java | 4 +- .../repository/EngineRepositoryHolder.java | 7 ++- .../rec/engine/sdk/server/RegisterClient.java | 24 +++++++++ 12 files changed, 97 insertions(+), 94 deletions(-) diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/BaseDataServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/BaseDataServiceImpl.java index 623000a..b47b997 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/BaseDataServiceImpl.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/BaseDataServiceImpl.java @@ -14,6 +14,7 @@ import cn.icanci.rec.common.model.TextValue; import cn.icanci.rec.common.model.config.BaseDataVO; import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.engine.script.RecScriptEngine; +import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.script.context.RecScriptEngineContext; import cn.icanci.rec.engine.script.enums.ResultTypeMapEnum; import cn.icanci.rec.spi.event.EventDispatcher; @@ -38,13 +39,13 @@ import com.google.common.collect.Lists; @Service public class BaseDataServiceImpl implements BaseDataService { @Resource - private BaseDataDAO baseDataDAO; + private BaseDataDAO baseDataDAO; @Resource - private BaseDataMapper baseDataMapper; + private BaseDataMapper baseDataMapper; @Resource - private RecScriptEngine recScriptEngine; - @Resource - private EventDispatcher eventDispatcher; + private EventDispatcher eventDispatcher; + + private final RecScriptEngine recScriptEngine = RecScriptEngineManager.getRecScriptEngine(); @Override public List queryAll() { diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java index a612dab..4eae568 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/DataSourceServiceImpl.java @@ -14,6 +14,7 @@ import cn.icanci.rec.common.model.TextValue; import cn.icanci.rec.common.model.config.DataSourceVO; import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.engine.script.RecScriptEngine; +import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.script.context.RecScriptEngineContext; import cn.icanci.rec.engine.script.wrapper.HttpResponseWrapper; import cn.icanci.rec.spi.event.EventDispatcher; @@ -41,10 +42,10 @@ public class DataSourceServiceImpl implements DataSourceService { @Resource private DataSourceMapper dataSourceMapper; @Resource - private RecScriptEngine recScriptEngine; - @Resource private EventDispatcher eventDispatcher; + private final RecScriptEngine recScriptEngine = RecScriptEngineManager.getRecScriptEngine(); + /** label 格式化 */ String DELETED_TYPE_FORMAT = "[无效] [%s] %s"; diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java index 77ec075..9eb57e0 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/service/impl/StrategyServiceImpl.java @@ -1,21 +1,5 @@ package cn.icanci.rec.admin.biz.service.impl; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import javax.annotation.Resource; -import javax.script.CompiledScript; - -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - import cn.icanci.rec.admin.biz.event.log.LogEvent; import cn.icanci.rec.admin.biz.mapper.config.StrategyMapper; import cn.icanci.rec.admin.biz.mapper.config.StrategyVoDtoMapper; @@ -33,6 +17,7 @@ import cn.icanci.rec.common.enums.ScriptTypeEnum; import cn.icanci.rec.common.model.config.StrategyVO; import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.engine.script.RecScriptEngine; +import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.sdk.actuator.RecRuleEngineActuator; import cn.icanci.rec.engine.sdk.actuator.RuleEngineRequest; import cn.icanci.rec.engine.sdk.actuator.RuleEngineResponse; @@ -40,6 +25,22 @@ import cn.icanci.rec.engine.sdk.rule.repository.DomainSceneKey; import cn.icanci.rec.engine.sdk.rule.repository.EngineRepositoryHolder; import cn.icanci.rec.spi.event.EventDispatcher; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.annotation.Resource; +import javax.script.CompiledScript; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + /** * @author icanci * @since 1.0 Created in 2022/11/12 10:38 @@ -59,10 +60,10 @@ public class StrategyServiceImpl implements StrategyService { @Resource private RecRuleEngineActuator recRuleEngineActuator; @Resource - private RecScriptEngine recScriptEngine; - @Resource private WebApiService webApiService; + private final RecScriptEngine recScriptEngine = RecScriptEngineManager.getRecScriptEngine(); + @Override public List queryAll() { return strategyMapper.dos2vos(strategyDAO.queryAll()); diff --git a/rec-admin/rec-admin-views/src/main/resources/application.yml b/rec-admin/rec-admin-views/src/main/resources/application.yml index 221501e..cdc4fbf 100644 --- a/rec-admin/rec-admin-views/src/main/resources/application.yml +++ b/rec-admin/rec-admin-views/src/main/resources/application.yml @@ -11,14 +11,11 @@ logging: # rec.defaultPort 指的是服务端Netty监听端口 rec: env: test - server: - ip: 127.0.0.1 - port: 9999 - client: - port: 10000 - domain: - load-all: false + load: false appName: rec-admin + client-port: 10000 + server-port: 9999 + server-ips: 127.0.0.1 spring: servlet: diff --git a/rec-core/src/main/resources/application.yml b/rec-core/src/main/resources/application.yml index 8ecfb4e..7cfd4a4 100644 --- a/rec-core/src/main/resources/application.yml +++ b/rec-core/src/main/resources/application.yml @@ -12,7 +12,7 @@ logging: # 接入方需要上报自己的信息给注册中心 rec: env: test - domain: empty + load: true load-all: true client-port: 11000 server-ips: 127.0.0.1 diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/RecScriptEngineManager.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/RecScriptEngineManager.java index 84f8109..655d8ca 100644 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/RecScriptEngineManager.java +++ b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/RecScriptEngineManager.java @@ -7,12 +7,17 @@ import cn.icanci.rec.engine.script.impl.RecScriptEngineImpl; * @since 1.0 Created in 2022/11/12 22:27 */ public final class RecScriptEngineManager { + /** * 获取 REC 执行引擎 * * @return 返回 REC 执行引擎 */ public static RecScriptEngine getRecScriptEngine() { - return new RecScriptEngineImpl(); + return RecScriptEngineHolder.INSTANCE; + } + + private static class RecScriptEngineHolder { + private static final RecScriptEngine INSTANCE = new RecScriptEngineImpl(); } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java index f705a55..5c2486e 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/RecEngineSDKAutoConfig.java @@ -1,27 +1,19 @@ package cn.icanci.rec.engine.sdk; import cn.icanci.rec.common.utils.FieldUtils; -import cn.icanci.rec.engine.script.RecScriptEngine; -import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.sdk.exception.InjectionBeanException; import cn.icanci.rec.engine.sdk.extensions.RecExtensionLoader; import cn.icanci.rec.engine.sdk.extensions.SpringBean; import cn.icanci.rec.engine.sdk.properties.RecProperties; -import cn.icanci.rec.engine.sdk.rule.repository.EngineRepositoryHolder; import cn.icanci.rec.engine.sdk.spi.*; import java.lang.reflect.Field; import java.util.Set; -import javax.annotation.Resource; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.InitializingBean; import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -37,33 +29,15 @@ import com.google.common.collect.Sets; @ComponentScan({ "cn.icanci.rec.engine.sdk" }) @EnableConfigurationProperties(RecProperties.class) //@ConditionalOnClass(RuleAggregationCluster.class) -public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandLineRunner, InitializingBean { - - @Resource - private RecProperties recProperties; - @Resource - private DomainSPI domainSPI; - @Resource - private EngineRepositoryHolder engineRepositoryHolder; - +@AutoConfigureBefore +public class RecEngineSDKAutoConfig implements CommandLineRunner { /** * Spring 上下文 */ - private ApplicationContext context; + private ApplicationContext context; - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - context = applicationContext; - } - - /** - * 执行引擎 - * - * @return 返回脚本执行引擎 - */ - @Bean("recScriptEngine") - public RecScriptEngine recScriptEngine() { - return RecScriptEngineManager.getRecScriptEngine(); + public RecEngineSDKAutoConfig(ApplicationContext context) { + this.context = context; } // ============================== SPI ============================== @@ -189,20 +163,4 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL // no op } - @Override - public void afterPropertiesSet() throws Exception { - // 项目启动加载缓存 - boolean loadAll = recProperties.isLoadAll(); - if (loadAll) { - Set domainCodes = domainSPI.loadAllDomainCodes(); - engineRepositoryHolder.refresh(domainCodes); - return; - } - - String domain = recProperties.getDomain(); - if (StringUtils.isNotBlank(domain)) { - Set domainCodes = Sets.newHashSet(domain.replaceAll("\\s*", StringUtils.EMPTY).split(",")); - engineRepositoryHolder.refresh(domainCodes); - } - } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/AbstractCondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/AbstractCondition.java index fff5909..871b469 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/AbstractCondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/AbstractCondition.java @@ -4,6 +4,7 @@ import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.enums.ResultTypeEnum; import cn.icanci.rec.common.enums.ScriptTypeEnum; import cn.icanci.rec.engine.script.RecScriptEngine; +import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.script.context.RecScriptEngineContext; import cn.icanci.rec.engine.script.enums.ResultTypeMapEnum; import cn.icanci.rec.engine.sdk.rule.repository.EngineRepositoryHolder; @@ -20,8 +21,8 @@ public abstract class AbstractCondition implements Condition { /** 推送仓储 */ @Resource protected EngineRepositoryHolder engineRepositoryHolder; - @Resource - private RecScriptEngine recScriptEngine; + + private final RecScriptEngine recScriptEngine = RecScriptEngineManager.getRecScriptEngine(); /** * 获取左值 diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/properties/RecProperties.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/properties/RecProperties.java index 9c018b3..666dc1a 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/properties/RecProperties.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/properties/RecProperties.java @@ -22,28 +22,32 @@ public class RecProperties { */ private String domain; + /** + * 是否需要加载,不加载则不会注册并加载数据 + */ + private boolean load = false; + /** * 是否加载所有域,为true则加载所有域,为false则加载domain */ - private boolean loadAll; + private boolean loadAll = false; /** * 加载的环境 */ - private String env; + private String env = "test"; /** * 客户端注册的port */ - private int clientPort; - + private int clientPort = 11000; /** * 服务端ip,以,分隔 */ - private String serverIps; + private String serverIps = "127.0.0.1"; /** * 服务端port */ - private int serverPort; + private int serverPort = 9999; public String getAppName() { return appName; @@ -61,6 +65,14 @@ public class RecProperties { this.domain = domain; } + public boolean isLoad() { + return load; + } + + public void setLoad(boolean load) { + this.load = load; + } + public boolean isLoadAll() { return loadAll; } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java index e03a5d1..3a24c49 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineExecutor.java @@ -6,6 +6,7 @@ import cn.icanci.rec.common.aggregation.model.StrategyDTO; import cn.icanci.rec.common.enums.*; import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.engine.script.RecScriptEngine; +import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.script.context.RecScriptEngineContext; import cn.icanci.rec.engine.script.wrapper.HttpResponseWrapper; import cn.icanci.rec.engine.sdk.actuator.RuleEngineRequest; @@ -39,8 +40,7 @@ public final class EngineExecutor { @Resource private EngineRepositoryHolder holder; - @Resource - private RecScriptEngine recScriptEngine; + private final RecScriptEngine recScriptEngine = RecScriptEngineManager.getRecScriptEngine(); @Resource private ScriptExecutorPoolHolder scriptExecutorPoolHolder; diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepositoryHolder.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepositoryHolder.java index 73ddf09..d6c5c8d 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepositoryHolder.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepositoryHolder.java @@ -4,6 +4,7 @@ import cn.icanci.rec.common.aggregation.model.*; import cn.icanci.rec.common.enums.DataSourceTypeEnum; import cn.icanci.rec.common.enums.ScriptTypeEnum; import cn.icanci.rec.engine.script.RecScriptEngine; +import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.sdk.properties.RecProperties; import cn.icanci.rec.engine.sdk.rule.EngineRepositoryLoader; import cn.icanci.rec.engine.sdk.server.RecNettyClientHandler; @@ -34,13 +35,15 @@ import com.google.common.collect.Sets; @Service public class EngineRepositoryHolder implements InitializingBean { private static final Logger logger = LoggerFactory.getLogger(EngineRepositoryHolder.class); + @Resource private EngineRepositoryLoader engineRepositoryLoader; - @Resource - private RecScriptEngine recScriptEngine; + @Resource private RecProperties recProperties; + private final RecScriptEngine recScriptEngine = RecScriptEngineManager.getRecScriptEngine(); + /** 缓存 key:domainCode value:EngineRepository */ private static final Map ENGINE_REPOSITORY_CONFIG = Maps.newConcurrentMap(); diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RegisterClient.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RegisterClient.java index 9b9b5a3..30648c3 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RegisterClient.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/server/RegisterClient.java @@ -11,6 +11,7 @@ import cn.icanci.rec.engine.script.client.http.HttpMethod; import cn.icanci.rec.engine.script.client.http.OkHttpClientImpl; import cn.icanci.rec.engine.script.client.serializer.SerializerEnum; import cn.icanci.rec.engine.sdk.properties.RecProperties; +import cn.icanci.rec.engine.sdk.rule.repository.EngineRepositoryHolder; import cn.icanci.rec.engine.sdk.spi.DomainSPI; import java.util.Set; @@ -20,12 +21,14 @@ import java.util.concurrent.TimeUnit; import javax.annotation.Resource; +import org.apache.commons.lang3.StringUtils; 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; +import com.google.common.collect.Sets; /** * @author icanci @@ -40,6 +43,8 @@ public class RegisterClient implements InitializingBean { private RecProperties recProperties; @Resource private DomainSPI domainSPI; + @Resource + private EngineRepositoryHolder engineRepositoryHolder; private static final int CORE_SIZE = Runtime.getRuntime().availableProcessors(); @@ -95,6 +100,11 @@ public class RegisterClient implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { + if (!recProperties.isLoad()) { + return; + } + // 项目启动加载缓存 + refreshCache(); // 注入注册bean RecNettyClient.setRegisterService(this); @@ -102,4 +112,18 @@ public class RegisterClient implements InitializingBean { // 启动服务器 RecNettyClient.startClient(recProperties.getServerIps(), recProperties.getServerPort(), recProperties.getClientPort(), recProperties.getAppName()); } + + private void refreshCache() { + boolean loadAll = recProperties.isLoadAll(); + if (loadAll) { + Set domainCodes = domainSPI.loadAllDomainCodes(); + engineRepositoryHolder.refresh(domainCodes); + } + + String domain = recProperties.getDomain(); + if (StringUtils.isNotBlank(domain)) { + Set domainCodes = Sets.newHashSet(domain.replaceAll("\\s*", StringUtils.EMPTY).split(",")); + engineRepositoryHolder.refresh(domainCodes); + } + } } -- Gitee