From 3d4a87d38176ae13f4c2d88f4d22218fa29727ec Mon Sep 17 00:00:00 2001 From: icanci Date: Sat, 19 Nov 2022 12:33:34 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:icanci:=E8=87=AA=E5=8A=A8=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 ++- .../rec/common/aggregation/WebApiRequest.java | 7 ++ .../engine/script/client/RemoteException.java | 4 +- rec-engine/rec-engine-sdk-http/pom.xml | 1 + .../engine/sdk/http/spi/AbstractLoadSPI.java | 69 ++++++++++++++- .../engine/sdk/http/spi/HttpDomainSPI.java | 15 +++- .../engine/sdk/RecEngineSDKAutoConfig.java | 84 +++++++++---------- .../impl/RecRuleEngineActuatorImpl.java | 3 + .../rec/engine/sdk/rule/EngineExecutor.java | 2 + .../rule/pool/ScriptExecutorPoolHolder.java | 3 + 10 files changed, 144 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index 4911ae9..f4dc968 100644 --- a/README.md +++ b/README.md @@ -15,18 +15,18 @@ REC(Rule Engine Component)规则引擎组件:提供统一的规则处理 - rec-admin-dal:数据库管理模块 - rec-admin-views:视图模块 - rec-admin-web:对前端接口模块 -- rec-common:基础模型、枚举模块等 +- rec-common:基础模型、枚举模块、DTO模型、规则聚合等 - rec-core:核心独立部署服务 - 加载所有域进行流程处理,提供Facade接口和MQ的方式进行数据处理 + - MQ方式需自行处理,本项目不提供支持(MQ接入非常简单,不再赘言) - rec-engine:规则引擎处理器 - rec-engine-script:规则引擎脚本处理器 - - rec-engine-sdk:规则引擎SDK + - rec-engine-sdk:规则引擎SDK、SpringBootStarter模块(此处可能不太优雅) - rec-engine-sdk-http:规则引擎SDK的SPI实现,加载数据,HTTP实现 - rec-engine-sdk-netty:规则引擎SDK的SPI实现,加载数据,Netty实现 - rec-socket:rec通信管理 - rec-socket-client:rec通信客户端 - rec-socket-server:rec通信服务端 -- rec-spring-boot-starter:SpringBoot启动器 @@ -253,6 +253,12 @@ REC(Rule Engine Component)规则引擎组件:提供统一的规则处理 - 前端开发如果提示有报错,请禁用:ESLint +## REC-SDK +- + +## REC 注册中心 +- + ## TODO - 新建模块实现服务的运行:加载所有域的信息进行处理 rec-support,定义SPI加载接口,SDK和rec-core的实现不一致,取值方式不一致 diff --git a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/WebApiRequest.java b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/WebApiRequest.java index ee286da..938cb02 100644 --- a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/WebApiRequest.java +++ b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/WebApiRequest.java @@ -12,6 +12,13 @@ public class WebApiRequest implements Serializable { private Set domainCodes; + public WebApiRequest() { + } + + public WebApiRequest(Set domainCodes) { + this.domainCodes = domainCodes; + } + public Set getDomainCodes() { return domainCodes; } diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/RemoteException.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/RemoteException.java index bd78aef..dec82fb 100644 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/RemoteException.java +++ b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/client/RemoteException.java @@ -1,12 +1,10 @@ package cn.icanci.rec.engine.script.client; -import java.io.IOException; - /** * @author icanci * @since 1.0 Created in 2022/11/14 22:15 */ -public class RemoteException extends IOException { +public class RemoteException extends RuntimeException { /** 序列化版本 */ private static final long serialVersionUID = -850230685842125442L; diff --git a/rec-engine/rec-engine-sdk-http/pom.xml b/rec-engine/rec-engine-sdk-http/pom.xml index adb0519..c4425e8 100644 --- a/rec-engine/rec-engine-sdk-http/pom.xml +++ b/rec-engine/rec-engine-sdk-http/pom.xml @@ -22,5 +22,6 @@ rec-engine-sdk ${parent.version} + \ No newline at end of file diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java index a4b7202..d146662 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/AbstractLoadSPI.java @@ -1,8 +1,19 @@ package cn.icanci.rec.engine.sdk.http.spi; +import cn.icanci.rec.common.aggregation.WebApiRequest; +import cn.icanci.rec.common.aggregation.WebApiResponse; +import cn.icanci.rec.common.utils.FastJsonUtils; import cn.icanci.rec.common.utils.PropertiesUtil; +import cn.icanci.rec.engine.script.client.Client; +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 java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; + +import com.google.common.collect.Maps; /** * TODO 推拉模型,拉取配置时间,以秒为单位 PropertiesUtil 迁移到common测试 @@ -12,15 +23,67 @@ import java.util.Map; */ public abstract class AbstractLoadSPI { - private static final String PROPERTIES_NAME = "rec-http-spi-load.properties"; - - private static final String REQ_HTTP_PATH_PROP = "rec-http-request-url"; + private static final String PROPERTIES_NAME = "rec-http-spi-load.properties"; + private static final String REQ_HTTP_PATH_PROP = "rec-http-request-url"; + /** 服务请求请求路径 */ protected static final String REQ_HTTP_PATH; + /** 域请求路径 */ + protected static String LOAD_DOMAIN_PATH; + private static String LOAD_DOMAIN_PATH_SUFFIX = "/rec/webapi/loadDomains"; + /** 场景请求路径 */ + protected static String LOAD_SCENE_PATH; + private static String LOAD_SCENE_PATH_SUFFIX = "/rec/webapi/loadScenes"; + /** 元数据请求路径 */ + protected static String LOAD_METADATA_PATH; + private static String LOAD_METADATA_PATH_SUFFIX = "/rec/webapi/loadMetadatas"; + /** 基础数据请求路径 */ + protected static String LOAD_BASE_DATA_PATH; + private static String LOAD_BASE_DATA_PATH_SUFFIX = "/rec/webapi/loadBaseDatas"; + /** 数据源请求路径 */ + protected static String LOAD_DATA_SOURCE_PATH; + private static String LOAD_DATA_SOURCE_PATH_SUFFIX = "/rec/webapi/loadDataSources"; + /** 策略请求路径 */ + protected static String LOAD_STRATEGY_PATH; + private static String LOAD_STRATEGY_PATH_SUFFIX = "/rec/webapi/loadStrategies"; + + /** http实例 */ + protected static final Client CLIENT = OkHttpClientImpl.getInstance(); + /** DEFAULT_APPLICATION_JSON_VALUE */ + public static final String DEFAULT_APPLICATION_JSON_VALUE = "application/json"; + /** DEFAULT_TIMEOUT */ + private static final int DEFAULT_TIMEOUT = 3; static { // 加载数据 Map propertyMap = PropertiesUtil.getPropertyMap(Thread.currentThread().getContextClassLoader(), PROPERTIES_NAME); REQ_HTTP_PATH = propertyMap.get(REQ_HTTP_PATH_PROP); + + // 请求路径加载 + LOAD_DOMAIN_PATH = REQ_HTTP_PATH + LOAD_DOMAIN_PATH_SUFFIX; + LOAD_SCENE_PATH = REQ_HTTP_PATH + LOAD_SCENE_PATH_SUFFIX; + LOAD_METADATA_PATH = REQ_HTTP_PATH + LOAD_METADATA_PATH_SUFFIX; + LOAD_BASE_DATA_PATH = REQ_HTTP_PATH + LOAD_BASE_DATA_PATH_SUFFIX; + LOAD_DATA_SOURCE_PATH = REQ_HTTP_PATH + LOAD_DATA_SOURCE_PATH_SUFFIX; + LOAD_STRATEGY_PATH = REQ_HTTP_PATH + LOAD_STRATEGY_PATH_SUFFIX; + } + + /** + * 发送请求 + * + * @param clazz 请求返回类型 + * @param request 请求参数 + * @param reqPath 请求地址 + * @param 泛型 + * @return 返回执行结果 + */ + @SuppressWarnings("all") + public WebApiResponse call(Class clazz, String reqPath, HttpMethod httpMethod, WebApiRequest request) { + + Client.RpcRequest rpcRequest = new Client.RpcRequest(request, DEFAULT_APPLICATION_JSON_VALUE, Maps.newHashMap(), reqPath, httpMethod.name(), false, DEFAULT_TIMEOUT, + TimeUnit.SECONDS, 3, SerializerEnum.FASTJSON, SerializerEnum.FASTJSON); + + List ret = CLIENT.call(rpcRequest, WebApiResponse.class).getRet(); + return new WebApiResponse<>(FastJsonUtils.fromJSON2List(FastJsonUtils.toJSONString(ret), clazz)); } } diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java index db0bc12..c386bb2 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDomainSPI.java @@ -1,11 +1,15 @@ package cn.icanci.rec.engine.sdk.http.spi; +import cn.icanci.rec.common.aggregation.WebApiRequest; import cn.icanci.rec.common.aggregation.model.DomainDTO; +import cn.icanci.rec.engine.script.client.http.HttpMethod; import cn.icanci.rec.engine.sdk.spi.DomainSPI; import java.util.List; import java.util.Set; +import com.google.common.collect.Sets; + /** * @author icanci * @since 1.0 Created in 2022/11/15 21:02 @@ -14,16 +18,21 @@ public class HttpDomainSPI extends AbstractLoadSPI implements DomainSPI { @Override public DomainDTO loadOne(String domain) { - return null; + WebApiRequest request = new WebApiRequest(Sets.newHashSet(domain)); + return call(DomainDTO.class, LOAD_DOMAIN_PATH, HttpMethod.POST, request).getRet().iterator().next(); } @Override public List load(Set domains) { - return null; + WebApiRequest request = new WebApiRequest(domains); + return call(DomainDTO.class, LOAD_DOMAIN_PATH, HttpMethod.POST, request).getRet(); + } @Override public List load(String domain) { - return null; + WebApiRequest request = new WebApiRequest(Sets.newHashSet(domain)); + return call(DomainDTO.class, LOAD_DOMAIN_PATH, HttpMethod.POST, request).getRet(); + } } 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 77c37f0..9e3e572 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 @@ -3,15 +3,9 @@ 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.actuator.RecRuleEngineActuator; -import cn.icanci.rec.engine.sdk.actuator.impl.RecRuleEngineActuatorImpl; 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.rule.EngineExecutor; -import cn.icanci.rec.engine.sdk.rule.EngineRepositoryLoader; -import cn.icanci.rec.engine.sdk.rule.impl.EngineRepositoryLoaderImpl; -import cn.icanci.rec.engine.sdk.rule.pool.ScriptExecutorPoolHolder; import cn.icanci.rec.engine.sdk.rule.repository.EngineRepositoryHolder; import cn.icanci.rec.engine.sdk.spi.*; @@ -23,6 +17,7 @@ import org.springframework.boot.CommandLineRunner; 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; import com.google.common.collect.Sets; @@ -33,6 +28,7 @@ import com.google.common.collect.Sets; */ @Configuration +@ComponentScan({ "cn.icanci.rec.engine.sdk" }) //@ConditionalOnClass(RuleAggregationCluster.class) public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandLineRunner { /** @@ -45,25 +41,25 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL context = applicationContext; } - /** - * 执行引擎入口 - * - * @return 返回执行引擎入口 - */ - @Bean("recRuleEngineActuator") - public RecRuleEngineActuator recRuleEngineActuator() { - return new RecRuleEngineActuatorImpl(); - } - - /** - * 执行人 - * - * @return 返回执行人 - */ - @Bean("engineExecutor") - public EngineExecutor engineExecutor() { - return new EngineExecutor(); - } +// /** +// * 执行引擎入口 +// * +// * @return 返回执行引擎入口 +// */ +// @Bean("recRuleEngineActuator") +// public RecRuleEngineActuator recRuleEngineActuator() { +// return new RecRuleEngineActuatorImpl(); +// } + +// /** +// * 执行人 +// * +// * @return 返回执行人 +// */ +// @Bean("engineExecutor") +// public EngineExecutor engineExecutor() { +// return new EngineExecutor(); +// } /** * 执行引擎 @@ -107,15 +103,15 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL // ============================== SPI ============================== - /** - * 仓储加载执行引擎 - * - * @return 返回仓储加载执行引擎 - */ - @Bean("engineRepositoryLoader") - public EngineRepositoryLoader engineRepositoryLoader() { - return new EngineRepositoryLoaderImpl(); - } +// /** +// * 仓储加载执行引擎 +// * +// * @return 返回仓储加载执行引擎 +// */ +// @Bean("engineRepositoryLoader") +// public EngineRepositoryLoader engineRepositoryLoader() { +// return new EngineRepositoryLoaderImpl(); +// } /** * domainSPI @@ -232,16 +228,16 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL throw new InjectionBeanException(e); } } - - /** - * scriptExecutorPoolHolder - * - * @return scriptExecutorPoolHolder - */ - @Bean("scriptExecutorPoolHolder") - public ScriptExecutorPoolHolder scriptExecutorPoolHolder() { - return ScriptExecutorPoolHolder.getInstance(); - } +// +// /** +// * scriptExecutorPoolHolder +// * +// * @return scriptExecutorPoolHolder +// */ +// @Bean("scriptExecutorPoolHolder") +// public ScriptExecutorPoolHolder scriptExecutorPoolHolder() { +// return ScriptExecutorPoolHolder.getInstance(); +// } @Override public void run(String... args) throws Exception { diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/impl/RecRuleEngineActuatorImpl.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/impl/RecRuleEngineActuatorImpl.java index e025011..9662885 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/impl/RecRuleEngineActuatorImpl.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/impl/RecRuleEngineActuatorImpl.java @@ -7,10 +7,13 @@ import cn.icanci.rec.engine.sdk.rule.EngineExecutor; import javax.annotation.Resource; +import org.springframework.stereotype.Service; + /** * @author icanci * @since 1.0 Created in 2022/11/13 15:21 */ +@Service public class RecRuleEngineActuatorImpl implements RecRuleEngineActuator { @Resource 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 f769892..304f987 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 @@ -27,11 +27,13 @@ import javax.script.SimpleBindings; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; /** * @author icanci * @since 1.0 Created in 2022/11/15 23:17 */ +@Service public final class EngineExecutor { @Resource diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/pool/ScriptExecutorPoolHolder.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/pool/ScriptExecutorPoolHolder.java index ed30f36..fe1cae3 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/pool/ScriptExecutorPoolHolder.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/pool/ScriptExecutorPoolHolder.java @@ -7,12 +7,15 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import org.springframework.stereotype.Service; + /** * 脚本执行线程池处理器 * * @author icanci * @since 1.0 Created in 2022/11/16 21:06 */ +@Service public class ScriptExecutorPoolHolder { private static final ScriptExecutorPoolHolder instance = new ScriptExecutorPoolHolder(); -- Gitee From b26c345784199a62c82871bfadf1f204b3c3993e Mon Sep 17 00:00:00 2001 From: icanci Date: Sat, 19 Nov 2022 12:39:08 +0800 Subject: [PATCH 2/2] feat:icanci:RecEngineSDKAutoConfig --- .../engine/sdk/RecEngineSDKAutoConfig.java | 71 ------------------- .../repository/EngineRepositoryHolder.java | 2 + 2 files changed, 2 insertions(+), 71 deletions(-) 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 9e3e572..7bad7af 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 @@ -6,7 +6,6 @@ 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.rule.repository.EngineRepositoryHolder; import cn.icanci.rec.engine.sdk.spi.*; import java.lang.reflect.Field; @@ -41,26 +40,6 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL context = applicationContext; } -// /** -// * 执行引擎入口 -// * -// * @return 返回执行引擎入口 -// */ -// @Bean("recRuleEngineActuator") -// public RecRuleEngineActuator recRuleEngineActuator() { -// return new RecRuleEngineActuatorImpl(); -// } - -// /** -// * 执行人 -// * -// * @return 返回执行人 -// */ -// @Bean("engineExecutor") -// public EngineExecutor engineExecutor() { -// return new EngineExecutor(); -// } - /** * 执行引擎 * @@ -71,48 +50,8 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL return RecScriptEngineManager.getRecScriptEngine(); } - // /** - // * 执行引擎 暂不使用 - // * - // * @return 返回脚本执行引擎 - // */ - // @Bean("ruleAggregationCluster") - // public RuleAggregationCluster ruleAggregationCluster(AggregationRepositoryHolder aggregationRepositoryHolder, RecScriptEngine engine) { - // return new RuleAggregationClusterImpl(aggregationRepositoryHolder, engine); - // } - // - // /** - // * 执行引擎 暂不使用 - // * - // * @return 返回脚本执行引擎 - // */ - // @Bean("aggregationRepositoryHolder") - // public AggregationRepositoryHolder aggregationRepositoryHolder() { - // return new AggregationRepositoryHolder(); - // } - - /** - * 执行引擎 - * - * @return 返回脚本执行引擎 - */ - @Bean("engineRepositoryHolder") - public EngineRepositoryHolder engineRepositoryHolder() { - return new EngineRepositoryHolder(); - } - // ============================== SPI ============================== -// /** -// * 仓储加载执行引擎 -// * -// * @return 返回仓储加载执行引擎 -// */ -// @Bean("engineRepositoryLoader") -// public EngineRepositoryLoader engineRepositoryLoader() { -// return new EngineRepositoryLoaderImpl(); -// } - /** * domainSPI * @@ -228,16 +167,6 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL throw new InjectionBeanException(e); } } -// -// /** -// * scriptExecutorPoolHolder -// * -// * @return scriptExecutorPoolHolder -// */ -// @Bean("scriptExecutorPoolHolder") -// public ScriptExecutorPoolHolder scriptExecutorPoolHolder() { -// return ScriptExecutorPoolHolder.getInstance(); -// } @Override public void run(String... args) throws Exception { 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 31f265d..0122b49 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 @@ -18,6 +18,7 @@ import javax.script.CompiledScript; import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; import com.google.common.collect.Maps; @@ -25,6 +26,7 @@ import com.google.common.collect.Maps; * @author icanci * @since 1.0 Created in 2022/11/16 08:38 */ +@Service public class EngineRepositoryHolder { Logger logger = LoggerFactory.getLogger(EngineRepositoryHolder.class); @Resource -- Gitee