diff --git a/README.md b/README.md index 73cfd0589e4edda18755d0b83586c675806a27f3..b89257cd88a035eab4fc98c4a19d08671c01da52 100644 --- a/README.md +++ b/README.md @@ -228,4 +228,8 @@ REC(Rule Engine Component)规则引擎组件:提供统一的规则处理 - 新建模块实现服务的运行:加载所有域的信息进行处理 rec-support,定义SPI加载接口,SDK和rec-core的实现不一致,取值方式不一致 - rec-register:注册中心 - rec-group:组的概念SAAS -- 返回值类型,是否开启返回值,返回值模式 \ No newline at end of file +- 返回值类型,是否开启返回值,返回值模式 +- +- mvn versions:set -DnewVersion=0.0.0.1-SNAPSHOT +- mvn versions:revert +- mvn versions:commit \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2c72dd098d1679c8f83a29bd18ad69e330306472..10bd6828c382143bb03d8da1a19ae9abdec3664e 100644 --- a/pom.xml +++ b/pom.xml @@ -7,20 +7,34 @@ cn.icanci.rec rec-parent pom - ${revision} + 0.0.0.1-SNAPSHOT rec-admin rec-core rec-engine rec-spring-boot-starter - rec-socket rec-common rec-spi + Rule-Engine-Component + Rule Engine Component: provides a unified rule processing method and policy. Support SDK access and HTTP access; Only page configuration is needed to complete the + rule processing, and simple mode and complex mode are supported for editing. The front and rear end projects can be separated and deployed independently, or packaged and + deployed at the front and rear end. + + https://gitee.com/icanci/rec + - - 1.0.0.0-SNAPSHOT + + UTF-8 + + 3.8.1 + 3.0.0-M1 + 3.2.1 + 3.2.0 + 1.6.8 + 1.6 + 3.0.0-M1 1.8 UTF-8 @@ -232,39 +246,35 @@ jackson-databind + + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + icanci + icanci@foxmail.com + https://gitee.com/icanci + +8 + + + + + master + scm:git:https://gitee.com/icanci/rec.git + scm:git:https://gitee.com/icanci/rec.git + https://gitee.com/icanci/rec.git + + + ${project.artifactId}-${project.version} - - org.codehaus.mojo - flatten-maven-plugin - 1.2.7 - - clean - true - - remove - remove - - ${project.build.directory}/flattened - - - - flatten - process-resources - - flatten - - - - flatten.clean - clean - - clean - - - - org.apache.maven.plugins maven-source-plugin @@ -279,19 +289,179 @@ + + org.apache.maven.plugins + maven-javadoc-plugin + 3.0.0-M1 + + ${javadoc.opts} + + + + + src/main/resources + true + + - - - org.codehaus.mojo - flatten-maven-plugin - - - org.apache.maven.plugins - maven-source-plugin + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.target} + ${maven.compiler.source} + ${project.build.sourceEncoding} + true + + -parameters + + + + + + + disable-javadoc-doclint + + [1.8,) + + + -Xdoclint:none + + + + release + + + + org.apache.maven.plugins + maven-deploy-plugin + ${maven-deploy-plugin.version} + + + + org.apache.maven.plugins + maven-source-plugin + ${maven-source-plugin.version} + + + attach-sources + package + + jar-no-fork + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + package + + + date + + + + + + attach-javadocs + package + + jar + + + none + + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + verify + + sign + + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + ${nexus-staging-maven-plugin.version} + true + + oss-release + https://s01.oss.sonatype.org/ + true + + + + org.codehaus.mojo + flatten-maven-plugin + 1.2.7 + + clean + true + + remove + remove + + ${project.build.directory}/flattened + + + + flatten + process-resources + + flatten + + + + flatten.clean + clean + + clean + + + + + + + + + + sonatype-snapshots + https://s01.oss.sonatype.org/content/repositories/snapshots + + + sonatype-release + https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + + + + sonatype-snapshots + https://s01.oss.sonatype.org/content/repositories/snapshots + + + sonatype-release + https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ + + \ No newline at end of file diff --git a/rec-admin/pom.xml b/rec-admin/pom.xml index 3df8853b21d1f32edb4c1d434ef15716f199229d..b79aa156885ef7d609fb24178807e94d7351912e 100644 --- a/rec-admin/pom.xml +++ b/rec-admin/pom.xml @@ -5,7 +5,7 @@ rec-parent cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0 @@ -34,7 +34,7 @@ cn.icanci.rec rec-common - ${revision} + ${parent.version} diff --git a/rec-admin/rec-admin-biz/pom.xml b/rec-admin/rec-admin-biz/pom.xml index 3ca4553fda880111981d57e0e0934eda03fb46a3..0733b4f403a21f264f0693151284ca9fbe6cfc20 100644 --- a/rec-admin/rec-admin-biz/pom.xml +++ b/rec-admin/rec-admin-biz/pom.xml @@ -5,7 +5,7 @@ rec-admin cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0 @@ -20,17 +20,17 @@ cn.icanci.rec rec-admin-dal - ${revision} + ${parent.version} cn.icanci.rec rec-spi - ${revision} + ${parent.version} cn.icanci.rec rec-engine-script - ${revision} + ${parent.version} org.mapstruct diff --git a/rec-admin/rec-admin-dal/pom.xml b/rec-admin/rec-admin-dal/pom.xml index cc6740028e0a29a55f884048be98eacfc4aaaaa7..f3e2f4bc41f505ad639a70c695c3ac7d1319c648 100644 --- a/rec-admin/rec-admin-dal/pom.xml +++ b/rec-admin/rec-admin-dal/pom.xml @@ -5,7 +5,7 @@ rec-admin cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0 diff --git a/rec-admin/rec-admin-views/pom.xml b/rec-admin/rec-admin-views/pom.xml index 2b5e2c9dde1753b1e74b0e25a0659e44b92b6359..33e8078c441945fc5e4a0272e738b8b40e5c7b03 100644 --- a/rec-admin/rec-admin-views/pom.xml +++ b/rec-admin/rec-admin-views/pom.xml @@ -5,7 +5,7 @@ rec-admin cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0 @@ -31,7 +31,7 @@ cn.icanci.rec rec-admin-web - ${revision} + ${parent.version} diff --git a/rec-admin/rec-admin-web/pom.xml b/rec-admin/rec-admin-web/pom.xml index 94da97305f6a7ff6e657c2de269b2c4731598231..a48976a086cb6b6f4a0ce6b1a587fd48beb6a660 100644 --- a/rec-admin/rec-admin-web/pom.xml +++ b/rec-admin/rec-admin-web/pom.xml @@ -5,7 +5,7 @@ rec-admin cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0 @@ -20,7 +20,7 @@ cn.icanci.rec rec-admin-biz - ${revision} + ${parent.version} org.springframework.boot diff --git a/rec-common/pom.xml b/rec-common/pom.xml index ee0327e1b0084c57090b62f7ced2b0ede30c688d..9e728e0581148e70445b269a30c908f67709bf24 100644 --- a/rec-common/pom.xml +++ b/rec-common/pom.xml @@ -5,7 +5,7 @@ rec-parent cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0 diff --git a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/RuleAggregation.java b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/RuleAggregation.java index 7dfc384fd5251f52d922d5229b2433f0aa652d63..dcf37016a9effba4817726196cc279929d3d581d 100644 --- a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/RuleAggregation.java +++ b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/RuleAggregation.java @@ -9,9 +9,12 @@ import java.util.StringJoiner; /** * 规则聚合-单个规则需要的配置数据信息 * + * 如果需要数据迁移,可以使用此模型 + * * @author icanci * @since 1.0 Created in 2022/11/15 15:44 */ +@Deprecated public class RuleAggregation { /** 域 */ private DomainDTO domain; diff --git a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/BaseDataDTO.java b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/BaseDataDTO.java index fe8ebd3c756d608c1a46fbf2b53863b3ab7fa6af..fe0173fd690b3726df7bab875faf298c752c8fd2 100644 --- a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/BaseDataDTO.java +++ b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/BaseDataDTO.java @@ -4,42 +4,44 @@ import cn.icanci.rec.common.enums.DataTypeEnum; import cn.icanci.rec.common.enums.ResultTypeEnum; import cn.icanci.rec.common.enums.ScriptTypeEnum; +import javax.script.CompiledScript; + /** * @author icanci * @since 1.0 Created in 2022/11/15 17:14 */ public class BaseDataDTO extends BaseDTO { - private static final long serialVersionUID = -509622609203854310L; + private static final long serialVersionUID = -509622609203854310L; /** * 域Code */ - private String domainCode; + private String domainCode; /** * 基础数据名称 */ - private String fieldName; + private String fieldName; /** * 数据类型(布尔、字符串、数值、日期、元数据等) * * @see DataTypeEnum#name() */ - private String dataType; + private String dataType; /** * 关联的元数据uuid * * {@link DataTypeEnum#METADATA} */ - private String metadataUuid; + private String metadataUuid; /** * 脚本执行类型 * * @see ScriptTypeEnum#name() */ - private String scriptType; + private String scriptType; /** * 脚本内容 */ - private String scriptContent; + private String scriptContent; /** * TODO 是否有必要 * 脚本执行返回类型(只能是基本数据类型) @@ -47,7 +49,12 @@ public class BaseDataDTO extends BaseDTO { * @see ResultTypeEnum#name() */ @Deprecated - private String resultType; + private String resultType; + + /** + * 通过 Compilable 编译 scriptContent 之后的实例对象 + */ + private transient CompiledScript compiledScript; public String getDomainCode() { return domainCode; @@ -104,4 +111,12 @@ public class BaseDataDTO extends BaseDTO { public void setResultType(String resultType) { this.resultType = resultType; } + + public CompiledScript getCompiledScript() { + return compiledScript; + } + + public void setCompiledScript(CompiledScript compiledScript) { + this.compiledScript = compiledScript; + } } diff --git a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/DataSourceDTO.java b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/DataSourceDTO.java index ee1476f887917f4c66c5ba71b17e1e5c8097af8c..a017340f89fd1f27d0bccf1c0df15082c8aa2827 100644 --- a/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/DataSourceDTO.java +++ b/rec-common/src/main/java/cn/icanci/rec/common/aggregation/model/DataSourceDTO.java @@ -4,6 +4,8 @@ import cn.icanci.rec.common.enums.DataSourceTypeEnum; import cn.icanci.rec.common.enums.HttpRequestTypeEnum; import cn.icanci.rec.common.enums.ScriptTypeEnum; +import javax.script.CompiledScript; + /** * @author icanci * @since 1.0 Created in 2022/11/15 17:15 @@ -46,17 +48,22 @@ public class DataSourceDTO extends BaseDTO { * @see ScriptTypeEnum#name() * */ - private String scriptType; + private String scriptType; /** * 脚本内容 */ - private String scriptContent; + private String scriptContent; /** * 执行超时时间,秒 * 为0则不做限制 */ - private int timeout; + private int timeout; + + /** + * 通过 Compilable 编译 scriptContent 之后的实例对象 + */ + private transient CompiledScript compiledScript; public String getScriptType() { return scriptType; @@ -81,6 +88,14 @@ public class DataSourceDTO extends BaseDTO { public void setTimeout(int timeout) { this.timeout = timeout; } + + public CompiledScript getCompiledScript() { + return compiledScript; + } + + public void setCompiledScript(CompiledScript compiledScript) { + this.compiledScript = compiledScript; + } } /** diff --git a/rec-core/pom.xml b/rec-core/pom.xml index aed63f775ed32094403f7adab1038d63382717d6..4bb17a24e0f38d37a43dfac400f1d2d0a3c32581 100644 --- a/rec-core/pom.xml +++ b/rec-core/pom.xml @@ -5,7 +5,7 @@ rec-parent cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0 @@ -32,17 +32,17 @@ cn.icanci.rec rec-common - ${revision} + ${parent.version} cn.icanci.rec rec-engine-sdk - ${revision} + ${parent.version} cn.icanci.rec rec-engine-sdk-http - ${revision} + ${parent.version} diff --git a/rec-engine/pom.xml b/rec-engine/pom.xml index 92b307251a97643fceeecc79de069f5c5a02f8b9..436f13e9f818f7a51b5e80730ab0902550e4e428 100644 --- a/rec-engine/pom.xml +++ b/rec-engine/pom.xml @@ -5,7 +5,7 @@ rec-parent cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0 diff --git a/rec-engine/rec-engine-script/pom.xml b/rec-engine/rec-engine-script/pom.xml index 1aaab1db97a54d5d07a01fc6b51e5c9bb4f14ba1..82de7379f69e4f861b0e5c86a61de970218dea31 100644 --- a/rec-engine/rec-engine-script/pom.xml +++ b/rec-engine/rec-engine-script/pom.xml @@ -5,10 +5,10 @@ rec-engine cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0 - + jar rec-engine-script @@ -20,7 +20,7 @@ cn.icanci.rec rec-common - ${revision} + ${parent.version} diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/RecScriptEngine.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/RecScriptEngine.java index 141574c030a8c429ed5653c4c8d1d6bf3c1b6615..b02df96fcc21c7a885ab6f459655cdf1ca98d2ab 100644 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/RecScriptEngine.java +++ b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/RecScriptEngine.java @@ -6,6 +6,8 @@ import cn.icanci.rec.engine.script.context.RecScriptEngineContext; import cn.icanci.rec.engine.script.wrapper.HttpResponseWrapper; import javax.script.Bindings; +import javax.script.CompiledScript; +import javax.script.ScriptEngine; /** * 脚本执行引擎抽象顶级接口 @@ -14,6 +16,25 @@ import javax.script.Bindings; * @since 1.0 Created in 2022/11/12 22:12 */ public interface RecScriptEngine { + // ================================ 脚本编译 ================================ + + /** + * 根据脚本类型找到对应的执行引擎 + * + * @param scriptType scriptType + * @return 返回对应的执行引擎 + */ + ScriptEngine findEngine(ScriptTypeEnum scriptType); + + /** + * 根据脚本类型和脚本进行编译 + * + * @param scriptType scriptType + * @param scriptContent scriptContent + * @return 返回编译结果 + */ + CompiledScript compile(ScriptTypeEnum scriptType, String scriptContent); + // ================================ 脚本执行 ================================ /** * 执行脚本 @@ -68,4 +89,5 @@ public interface RecScriptEngine { * @return 返回请求执行结果 */ HttpResponseWrapper httpEval(HttpRequestTypeEnum requestType, String reqUrl, String reqParam, int timeout); + } diff --git a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/impl/RecScriptEngineImpl.java b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/impl/RecScriptEngineImpl.java index d7ac6591fd4285f9c789763c77f0c5f05bb2b93e..f8ed1b8eb8998a38b4ee15d641a0973b8521c5a7 100644 --- a/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/impl/RecScriptEngineImpl.java +++ b/rec-engine/rec-engine-script/src/main/java/cn/icanci/rec/engine/script/impl/RecScriptEngineImpl.java @@ -1,5 +1,13 @@ package cn.icanci.rec.engine.script.impl; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import javax.script.*; + +import com.google.common.collect.Maps; + import cn.icanci.rec.common.enums.HttpRequestTypeEnum; import cn.icanci.rec.common.enums.ScriptTypeEnum; import cn.icanci.rec.common.utils.FastJsonUtils; @@ -12,14 +20,6 @@ import cn.icanci.rec.engine.script.context.RecScriptEngineContext; import cn.icanci.rec.engine.script.factory.ScriptEngineFactory; import cn.icanci.rec.engine.script.wrapper.HttpResponseWrapper; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -import javax.script.*; - -import com.google.common.collect.Maps; - /** * @author icanci * @since 1.0 Created in 2022/11/12 22:46 @@ -30,6 +30,25 @@ public class RecScriptEngineImpl implements RecScriptEngine { /** DEFAULT_APPLICATION_JSON_VALUE */ public static final String DEFAULT_APPLICATION_JSON_VALUE = "application/json"; + @Override + public ScriptEngine findEngine(ScriptTypeEnum scriptType) { + return ScriptEngineFactory.getScriptEngine(scriptType); + } + + @Override + public CompiledScript compile(ScriptTypeEnum scriptType, String scriptContent) { + try { + ScriptEngine scriptEngine = ScriptEngineFactory.getScriptEngine(scriptType); + if (scriptEngine instanceof Compilable) { + Compilable compilable = (Compilable) scriptEngine; + return compilable.compile(scriptContent); + } + } catch (Throwable t) { + // No Op + } + return null; + } + /** * 执行脚本 * diff --git a/rec-engine/rec-engine-sdk-http/pom.xml b/rec-engine/rec-engine-sdk-http/pom.xml index b925fb7f2ad1b63270a364ba91613a9199f55ee0..9e24a16c515eb0d2a455d752927de58660ba43da 100644 --- a/rec-engine/rec-engine-sdk-http/pom.xml +++ b/rec-engine/rec-engine-sdk-http/pom.xml @@ -5,10 +5,10 @@ rec-engine cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0 - + jar rec-engine-sdk-http @@ -20,7 +20,7 @@ cn.icanci.rec rec-engine-sdk - ${revision} + ${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/HttpDataSourceSPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDataSourceSPI.java index 895ba794d45b3e6c5f2cb050447ce4ee21cbb2ff..b53a6c83cd1751191b2e05a7322183b532abde02 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDataSourceSPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpDataSourceSPI.java @@ -1,11 +1,11 @@ package cn.icanci.rec.engine.sdk.http.spi; -import cn.icanci.rec.common.aggregation.model.DataSourceDTO; -import cn.icanci.rec.engine.sdk.spi.DataSourceSPI; - import java.util.List; import java.util.Set; +import cn.icanci.rec.common.aggregation.model.DataSourceDTO; +import cn.icanci.rec.engine.sdk.spi.DataSourceSPI; + /** * @author icanci * @since 1.0 Created in 2022/11/15 21:26 @@ -20,9 +20,4 @@ public class HttpDataSourceSPI extends AbstractLoadSPI implements DataSourceSPI public List load(String domain) { return null; } - - @Override - public DataSourceDTO loadOne(String domain, String uuid) { - return null; - } } diff --git a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpStrategySPI.java b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpStrategySPI.java index d5f4c93bcb8797df68decb2a8b65012a48b83ec3..734c12187d366bda8d92f48abd08e1e45111b506 100644 --- a/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpStrategySPI.java +++ b/rec-engine/rec-engine-sdk-http/src/main/java/cn/icanci/rec/engine/sdk/http/spi/HttpStrategySPI.java @@ -21,8 +21,4 @@ public class HttpStrategySPI extends AbstractLoadSPI implements StrategySPI { return null; } - @Override - public StrategyDTO loadOne(String domain, String sceneCode) { - return null; - } } diff --git a/rec-engine/rec-engine-sdk-netty/pom.xml b/rec-engine/rec-engine-sdk-netty/pom.xml index 079e37d84de84064501fe53d20435064fd3c4e3d..95df87084069e320c2fd7d78df1b2589dcca0ec1 100644 --- a/rec-engine/rec-engine-sdk-netty/pom.xml +++ b/rec-engine/rec-engine-sdk-netty/pom.xml @@ -5,10 +5,10 @@ rec-engine cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0 - + jar rec-engine-sdk-netty @@ -20,7 +20,7 @@ cn.icanci.rec rec-engine-sdk - ${revision} + ${parent.version} \ No newline at end of file diff --git a/rec-engine/rec-engine-sdk/pom.xml b/rec-engine/rec-engine-sdk/pom.xml index 56f642e4eb57a1f4baa25699c287491179eba99a..ba8adf39b5b353097c624ffbf2535527a12c786a 100644 --- a/rec-engine/rec-engine-sdk/pom.xml +++ b/rec-engine/rec-engine-sdk/pom.xml @@ -5,10 +5,10 @@ rec-engine cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0 - + jar rec-engine-sdk @@ -20,17 +20,12 @@ cn.icanci.rec rec-common - ${revision} - - - cn.icanci.rec - rec-engine-rule - ${revision} + ${parent.version} cn.icanci.rec rec-engine-script - ${revision} + ${parent.version} 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 86c6fef0c59589eda0421555543664df412b4b39..fef45dec64c0f149c35d8364f6d73b11d402440f 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,12 +1,5 @@ package cn.icanci.rec.engine.sdk; -import org.springframework.beans.BeansException; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - import cn.icanci.rec.engine.script.RecScriptEngine; import cn.icanci.rec.engine.script.RecScriptEngineManager; import cn.icanci.rec.engine.sdk.actuator.RecRuleEngineActuator; @@ -16,10 +9,16 @@ import cn.icanci.rec.engine.sdk.rule.EngineExecutor; import cn.icanci.rec.engine.sdk.rule.EngineRepositoryLoader; import cn.icanci.rec.engine.sdk.rule.RuleAggregationCluster; import cn.icanci.rec.engine.sdk.rule.impl.EngineRepositoryLoaderImpl; -import cn.icanci.rec.engine.sdk.rule.impl.RuleAggregationClusterImpl; -import cn.icanci.rec.engine.sdk.rule.repository.EngineRepository; +import cn.icanci.rec.engine.sdk.rule.repository.EngineRepositoryHolder; import cn.icanci.rec.engine.sdk.spi.*; +import org.springframework.beans.BeansException; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + /** * @author icanci * @since 1.0 Created in 2022/11/15 20:34 @@ -68,24 +67,34 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware { return RecScriptEngineManager.getRecScriptEngine(); } - /** - * 执行引擎 - * - * @return 返回脚本执行引擎 - */ - @Bean("ruleAggregationCluster") - public RuleAggregationCluster ruleAggregationCluster(EngineRepository engineRepository, RecScriptEngine engine) { - return new RuleAggregationClusterImpl(engineRepository, engine); - } +// /** +// * 执行引擎 暂不使用 +// * +// * @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("engineRepository") - public EngineRepository engineRepository() { - return new EngineRepository(); + @Bean("engineRepositoryHolder") + public EngineRepositoryHolder engineRepositoryHolder() { + return new EngineRepositoryHolder(); } // ============================== SPI ============================== diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/RuleEngineResponse.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/RuleEngineResponse.java index 555eafa1c72f23e6a6340858a7c7b5f04fd4eb44..9815b4d949caea504ec3c413ad6176a8ed564299 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/RuleEngineResponse.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/actuator/RuleEngineResponse.java @@ -10,4 +10,7 @@ import java.io.Serializable; */ public class RuleEngineResponse implements Serializable { private static final long serialVersionUID = -4658078915045778725L; + private boolean success; + private String errorMessage; + } 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 1e12445beba8116e80e0a154d3c28f5897c6e851..e025011a5c681e3f9293660963e7ebef40425d6e 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 @@ -3,8 +3,7 @@ package cn.icanci.rec.engine.sdk.actuator.impl; import cn.icanci.rec.engine.sdk.actuator.RecRuleEngineActuator; import cn.icanci.rec.engine.sdk.actuator.RuleEngineRequest; import cn.icanci.rec.engine.sdk.actuator.RuleEngineResponse; -import cn.icanci.rec.engine.sdk.rule.repository.EngineRepository; -import cn.icanci.rec.engine.sdk.rule.runtime.RuleAggregationCompiled; +import cn.icanci.rec.engine.sdk.rule.EngineExecutor; import javax.annotation.Resource; @@ -15,11 +14,10 @@ import javax.annotation.Resource; public class RecRuleEngineActuatorImpl implements RecRuleEngineActuator { @Resource - private EngineRepository engineRepository; + private EngineExecutor engineExecutor; @Override public RuleEngineResponse executor(RuleEngineRequest request) { - RuleAggregationCompiled compiled = engineRepository.loadRuleAggregationCompiled(request.getDomainCode(), request.getSceneCode()); - return null; + return engineExecutor.execute(request); } } 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 491f1adc4979c3197570a22e05b41979325be3c7..ad40512c2baf7e1396fbeacc434ee88351ab2d69 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 @@ -1,8 +1,9 @@ package cn.icanci.rec.engine.sdk.rule; +import cn.icanci.rec.common.aggregation.model.StrategyDTO; import cn.icanci.rec.engine.sdk.actuator.RuleEngineRequest; import cn.icanci.rec.engine.sdk.actuator.RuleEngineResponse; -import cn.icanci.rec.engine.sdk.rule.repository.EngineRepository; +import cn.icanci.rec.engine.sdk.rule.repository.EngineRepositoryHolder; import javax.annotation.Resource; @@ -13,9 +14,33 @@ import javax.annotation.Resource; public final class EngineExecutor { @Resource - private EngineRepository engineRepository; + private EngineRepositoryHolder holder; + /** + * 执行入口 + * + * @param request request + * @return 返回执行结果 + */ public RuleEngineResponse execute(RuleEngineRequest request) { + // 1.数据基本校验 + validator(request); + + // 2.获取策略 + StrategyDTO strategy = holder.getStrategy(request.getDomainCode(), request.getSceneCode()); + // 3.聚合数据 + + // 4.执行 + // 5.返回执行结果 return null; } + + /** + * 数据基本校验 + * + * @param request request + */ + private void validator(RuleEngineRequest request) { + + } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineRepositoryLoader.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineRepositoryLoader.java index b14744d603ad7a5d2b96831feab3bfab3d0ea27f..f201031aa3ff45dcf35c1118bf0a1f1734c45230 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineRepositoryLoader.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/EngineRepositoryLoader.java @@ -1,9 +1,9 @@ package cn.icanci.rec.engine.sdk.rule; -import java.util.List; - import cn.icanci.rec.common.aggregation.model.*; +import java.util.List; + /** * @author icanci * @since 1.0 Created in 2022/11/15 19:16 @@ -56,17 +56,15 @@ public interface EngineRepositoryLoader { * 加载数据源信息 * * @param domainCode domainCode - * @param sceneCode sceneCode * @return 返回数据源信息 */ - DataSourceDTO loadDataSource(String domainCode, String sceneCode); + List loadDataSource(String domainCode); /** * 加载执行策略 * * @param domainCode domainCode - * @param sceneCode sceneCode * @return 返回执行策略 */ - StrategyDTO loadStrategy(String domainCode, String sceneCode); + List loadStrategy(String domainCode); } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/RuleAggregationCluster.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/RuleAggregationCluster.java index 143b076b2252835479f8e9fad15f64a99d5829a7..751e7ac16f77caea00bc955ef5c4973433ba1bb4 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/RuleAggregationCluster.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/RuleAggregationCluster.java @@ -4,11 +4,12 @@ import cn.icanci.rec.common.aggregation.RuleAggregation; import cn.icanci.rec.engine.sdk.rule.runtime.RuleAggregationCompiled; /** - * 规则聚合簇 + * 规则聚合簇,此方法暂不实现 * * @author icanci * @since 1.0 Created in 2022/11/15 15:32 */ +@Deprecated public interface RuleAggregationCluster { /** diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/EngineRepositoryLoaderImpl.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/EngineRepositoryLoaderImpl.java index a5ecfe9a11a2fdd8026907d3c74639cbca1a1dcd..3b593d5d616d65a667dfff597225a3ce55f2e427 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/EngineRepositoryLoaderImpl.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/EngineRepositoryLoaderImpl.java @@ -1,19 +1,17 @@ package cn.icanci.rec.engine.sdk.rule.impl; +import cn.icanci.rec.common.aggregation.model.*; +import cn.icanci.rec.engine.sdk.rule.EngineRepositoryLoader; +import cn.icanci.rec.engine.sdk.spi.*; + import java.util.List; -import java.util.Map; import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Resource; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; -import cn.icanci.rec.common.aggregation.model.*; -import cn.icanci.rec.engine.sdk.rule.EngineRepositoryLoader; -import cn.icanci.rec.engine.sdk.spi.*; - /** * @author icanci * @since 1.0 Created in 2022/11/15 19:28 @@ -22,19 +20,17 @@ import cn.icanci.rec.engine.sdk.spi.*; public class EngineRepositoryLoaderImpl implements EngineRepositoryLoader { @Resource - private DomainSPI domainSPI; + private DomainSPI domainSPI; @Resource - private SceneSPI sceneSPI; + private SceneSPI sceneSPI; @Resource - private BaseDataSPI baseDataSPI; + private BaseDataSPI baseDataSPI; @Resource - private MetadataSPI metadataSPI; + private MetadataSPI metadataSPI; @Resource - private DataSourceSPI dataSourceSPI; + private DataSourceSPI dataSourceSPI; @Resource - private StrategySPI strategySPI; - - private static final Map DOMAIN_DTO_MAP = new ConcurrentHashMap<>(); + private StrategySPI strategySPI; @Override public DomainDTO loadDomain(String domainCode) { @@ -64,18 +60,12 @@ public class EngineRepositoryLoaderImpl implements EngineRepositoryLoader { return metadataSPI.load(domainCode); } - @Override - public DataSourceDTO loadDataSource(String domainCode, String sceneCode) { - StrategyDTO strategy = loadStrategy(domainCode, sceneCode); - if (strategy == null || StringUtils.isBlank(strategy.getDataSourceUuid())) { - return null; - } - String dataSourceUuid = strategy.getDataSourceUuid(); - return dataSourceSPI.loadOne(domainCode, dataSourceUuid); + @Override public List loadDataSource(String domainCode) { + return dataSourceSPI.load(domainCode); } @Override - public StrategyDTO loadStrategy(String domainCode, String sceneCode) { - return strategySPI.loadOne(domainCode, sceneCode); + public List loadStrategy(String domainCode) { + return strategySPI.load(domainCode); } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/RuleAggregationClusterImpl.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/RuleAggregationClusterImpl.java index 7e9cb71c5d70a728d1c0283f0784de289671d92a..dd7e42049c395a8aa1328f0593110dfd667daef2 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/RuleAggregationClusterImpl.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/impl/RuleAggregationClusterImpl.java @@ -1,11 +1,10 @@ package cn.icanci.rec.engine.sdk.rule.impl; import cn.icanci.rec.common.aggregation.RuleAggregation; -import cn.icanci.rec.common.aggregation.model.DomainDTO; import cn.icanci.rec.engine.script.RecScriptEngine; import cn.icanci.rec.engine.sdk.exception.RuleAggregationException; import cn.icanci.rec.engine.sdk.rule.RuleAggregationCluster; -import cn.icanci.rec.engine.sdk.rule.repository.EngineRepository; +import cn.icanci.rec.engine.sdk.rule.repository.AggregationRepositoryHolder; import cn.icanci.rec.engine.sdk.rule.runtime.RuleAggregationCompiled; /** @@ -15,13 +14,13 @@ import cn.icanci.rec.engine.sdk.rule.runtime.RuleAggregationCompiled; public class RuleAggregationClusterImpl implements RuleAggregationCluster { /** 仓储的实现类 */ - private EngineRepository engineRepository; + private AggregationRepositoryHolder holder; /** 编译执行引擎 */ - private RecScriptEngine engine; + private RecScriptEngine engine; - public RuleAggregationClusterImpl(EngineRepository engineRepository, RecScriptEngine engine) { - this.engineRepository = engineRepository; + public RuleAggregationClusterImpl(AggregationRepositoryHolder engineRepositoryHolder, RecScriptEngine engine) { + this.holder = engineRepositoryHolder; this.engine = engine; } @@ -29,12 +28,12 @@ public class RuleAggregationClusterImpl implements RuleAggregationCluster { public RuleAggregation buildAgg(String domainCode, String sceneCode) { try { RuleAggregation aggregation = new RuleAggregation(); - aggregation.setDomain(engineRepository.loadDomain(domainCode)); - aggregation.setScenePair(engineRepository.loadScenePair(domainCode, sceneCode)); - aggregation.setBaseDatas(engineRepository.loadBaseDatas(domainCode)); - aggregation.setMetadatas(engineRepository.loadMetadatas(domainCode)); - aggregation.setDataSource(engineRepository.loadDataSource(domainCode, sceneCode)); - aggregation.setStrategy(engineRepository.loadStrategy(domainCode, sceneCode)); + aggregation.setDomain(holder.loadDomain(domainCode)); + aggregation.setScenePair(holder.loadScenePair(domainCode, sceneCode)); + aggregation.setBaseDatas(holder.loadBaseDatas(domainCode)); + aggregation.setMetadatas(holder.loadMetadatas(domainCode)); + aggregation.setDataSource(holder.loadDataSource(domainCode, sceneCode)); + aggregation.setStrategy(holder.loadStrategy(domainCode, sceneCode)); return aggregation; } catch (Throwable e) { return null; @@ -48,8 +47,6 @@ public class RuleAggregationClusterImpl implements RuleAggregationCluster { if (agg == null) { throw new RuleAggregationException("Build RuleAggregation by domainCode: " + domainCode + " result is Null! Compilation failed!"); } - DomainDTO domain = agg.getDomain(); - return null; } catch (Throwable e) { throw new RuleAggregationException(e); diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/AggregationRepositoryHolder.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/AggregationRepositoryHolder.java new file mode 100644 index 0000000000000000000000000000000000000000..9466bfbed2fee6ebf093f3f43621b641ce5611d4 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/AggregationRepositoryHolder.java @@ -0,0 +1,42 @@ +package cn.icanci.rec.engine.sdk.rule.repository; + +import java.util.List; + +import cn.icanci.rec.common.aggregation.model.*; +import cn.icanci.rec.engine.sdk.rule.runtime.RuleAggregationCompiled; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/16 08:51 + */ +@Deprecated +public class AggregationRepositoryHolder { + + public DomainDTO loadDomain(String domainCode) { + return null; + } + + public SceneDTO.ScenePair loadScenePair(String domainCode, String sceneCode) { + return null; + } + + public List loadBaseDatas(String domainCode) { + return null; + } + + public List loadMetadatas(String domainCode) { + return null; + } + + public DataSourceDTO loadDataSource(String domainCode, String sceneCode) { + return null; + } + + public StrategyDTO loadStrategy(String domainCode, String sceneCode) { + return null; + } + + public RuleAggregationCompiled loadRuleAggregationCompiled(String domainCode, String sceneCode) { + return null; + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/DomainSceneKey.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/DomainSceneKey.java new file mode 100644 index 0000000000000000000000000000000000000000..07f1e993f90fda1ac01325bd02ff6f8d9adcbd89 --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/DomainSceneKey.java @@ -0,0 +1,54 @@ +package cn.icanci.rec.engine.sdk.rule.repository; + +import java.util.Objects; +import java.util.StringJoiner; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/16 08:35 + */ +public class DomainSceneKey { + private String domainCode; + private String sceneCode; + + public DomainSceneKey(String domainCode, String sceneCode) { + this.domainCode = domainCode; + this.sceneCode = sceneCode; + } + + public String getDomainCode() { + return domainCode; + } + + public void setDomainCode(String domainCode) { + this.domainCode = domainCode; + } + + public String getSceneCode() { + return sceneCode; + } + + public void setSceneCode(String sceneCode) { + this.sceneCode = sceneCode; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + DomainSceneKey that = (DomainSceneKey) o; + return Objects.equals(domainCode, that.domainCode) && Objects.equals(sceneCode, that.sceneCode); + } + + @Override + public int hashCode() { + return Objects.hash(domainCode, sceneCode); + } + + @Override + public String toString() { + return new StringJoiner(",").add("domainCode=" + domainCode).add("sceneCode=" + sceneCode).toString(); + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepository.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepository.java index 20a5b0f2d074dfb47654c6b608ed4004d64ce0f0..6b0d59ed58d3181d034cf1ceb9555a69c91132d8 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepository.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepository.java @@ -1,19 +1,11 @@ package cn.icanci.rec.engine.sdk.rule.repository; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Resource; +import cn.icanci.rec.common.aggregation.model.*; -import org.apache.commons.collections4.CollectionUtils; +import java.util.Map; import com.google.common.collect.Maps; -import cn.icanci.rec.common.aggregation.model.*; -import cn.icanci.rec.engine.sdk.rule.EngineRepositoryLoader; -import cn.icanci.rec.engine.sdk.rule.runtime.RuleAggregationCompiled; - /** * EngineRepository Local Cache * @@ -21,66 +13,58 @@ import cn.icanci.rec.engine.sdk.rule.runtime.RuleAggregationCompiled; * @since 1.0 Created in 2022/11/15 22:56 */ public final class EngineRepository { - @Resource - private EngineRepositoryLoader engineRepositoryLoader; - - /** 域缓存 */ - private static final Map DOMAIN_MAP = Maps.newConcurrentMap(); - - /** - * 刷新仓储 - * - * @param domainCodes domainCodes - */ - public void refresh(Set domainCodes) { - if (CollectionUtils.isEmpty(domainCodes)) { - return; - } - for (String domainCode : domainCodes) { - refresh(domainCode); - } - } + /** 域缓存 key:domainCode value:DomainDTO */ + private DomainDTO domainRepository; - /** - * 刷新仓储 - * - * @param domain domain - */ - private void refresh(String domain) { - List scenePairs = engineRepositoryLoader.loadScenePairs(domain); - if (CollectionUtils.isEmpty(scenePairs)) { - return; - } - // 刷新本地缓存 - // 刷新编译数据 + /** 基础数据缓存 key:uuid value:BaseDataDTO*/ + private Map baseDataRepository = Maps.newConcurrentMap(); - } + /** 元数据数据缓存 key:uuid value:MetadataDTO */ + private Map metadataRepository = Maps.newConcurrentMap(); - public DomainDTO loadDomain(String domainCode) { - return DOMAIN_MAP.get(domainCode); - } + /** 数据源缓存 key:uuid value:MetadataDTO*/ + private Map dataSourceRepository = Maps.newConcurrentMap(); - public SceneDTO.ScenePair loadScenePair(String domainCode, String sceneCode) { + /** 数据源缓存 key:DomainSceneKey value:StrategyDTO*/ + private Map strategyRepository = Maps.newConcurrentMap(); + public DomainDTO getDomainRepository() { + return domainRepository; } - public List loadBaseDatas(String domainCode) { - + public void setDomainRepository(DomainDTO domainRepository) { + this.domainRepository = domainRepository; } - public List loadMetadatas(String domainCode) { + public Map getBaseDataRepository() { + return baseDataRepository; + } + public void setBaseDataRepository(Map baseDataRepository) { + this.baseDataRepository = baseDataRepository; } - public DataSourceDTO loadDataSource(String domainCode, String sceneCode) { + public Map getMetadataRepository() { + return metadataRepository; + } + public void setMetadataRepository(Map metadataRepository) { + this.metadataRepository = metadataRepository; } - public StrategyDTO loadStrategy(String domainCode, String sceneCode) { + public Map getDataSourceRepository() { + return dataSourceRepository; + } + public void setDataSourceRepository(Map dataSourceRepository) { + this.dataSourceRepository = dataSourceRepository; } - public RuleAggregationCompiled loadRuleAggregationCompiled(String domainCode, String sceneCode) { + public Map getStrategyRepository() { + return strategyRepository; + } + public void setStrategyRepository(Map strategyRepository) { + this.strategyRepository = strategyRepository; } } 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 new file mode 100644 index 0000000000000000000000000000000000000000..63da3491d254ff87320ccd2d9c0d485d555fa00d --- /dev/null +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/rule/repository/EngineRepositoryHolder.java @@ -0,0 +1,201 @@ +package cn.icanci.rec.engine.sdk.rule.repository; + +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.sdk.rule.EngineRepositoryLoader; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.annotation.Resource; +import javax.script.CompiledScript; + +import org.apache.commons.collections4.CollectionUtils; + +import com.google.common.collect.Maps; + +/** + * @author icanci + * @since 1.0 Created in 2022/11/16 08:38 + */ +public class EngineRepositoryHolder { + @Resource + private EngineRepositoryLoader engineRepositoryLoader; + @Resource + private RecScriptEngine recScriptEngine; + + /** 缓存 key:domainCode value:EngineRepository */ + private static final Map ENGINE_REPOSITORY_CONFIG = Maps.newConcurrentMap(); + + /** + * 刷新仓储 + * + * @param domainCodes domainCodes + */ + public void refresh(Set domainCodes) { + if (CollectionUtils.isEmpty(domainCodes)) { + return; + } + for (String domainCode : domainCodes) { + refresh(domainCode); + } + } + + /** + * 刷新仓储 + * + * @param domain domain + */ + private void refresh(String domain) { + // 1.先获取场景,如果场景都没有,则不处理 + List scenePairs = engineRepositoryLoader.loadScenePairs(domain); + if (CollectionUtils.isEmpty(scenePairs)) { + return; + } + // 2.新建或者获取域对应的仓储 + EngineRepository repository = ENGINE_REPOSITORY_CONFIG.putIfAbsent(domain, new EngineRepository()); + + // 3.刷新本地缓存 + + // 3.1 刷新域信息 + repository.setDomainRepository(engineRepositoryLoader.loadDomain(domain)); + + // 3.2 刷新基础数据信息 + List baseDatas = engineRepositoryLoader.loadBaseDatas(domain); + // 3.2.1 编译执行脚本 + compileBaseDataScript(baseDatas); + // 3.2.2 属性仓储信息 + Map refreshBaseDatas = baseDatas.stream().collect(Collectors.toMap(BaseDTO::getUuid, baseData -> baseData)); + repository.getBaseDataRepository().putAll(refreshBaseDatas); + + // 3.3 刷新元数据信息 + List metadatas = engineRepositoryLoader.loadMetadatas(domain); + Map refreshMetadatas = metadatas.stream().collect(Collectors.toMap(BaseDTO::getUuid, metadata -> metadata)); + repository.getMetadataRepository().putAll(refreshMetadatas); + + // 3.4 刷新数据源信息 + List dataSources = engineRepositoryLoader.loadDataSource(domain); + // 3.4.1 编译执行脚本 + compileDataSourceScript(dataSources); + // 3.4.2 属性仓储信息 + Map refreshDataSources = dataSources.stream().collect(Collectors.toMap(BaseDTO::getUuid, dataSource -> dataSource)); + repository.getDataSourceRepository().putAll(refreshDataSources); + + // 3.5 构建策略信息 + List strategies = engineRepositoryLoader.loadStrategy(domain); + Map refreshStrategies = strategies.stream() + .collect(Collectors.toMap(x -> new DomainSceneKey(x.getDomainCode(), x.getSceneCode()), dataSource -> dataSource)); + repository.getStrategyRepository().putAll(refreshStrategies); + } + + /** + * 编译执行脚本 + * + * @param baseDatas baseDatas + */ + private void compileBaseDataScript(List baseDatas) { + if (CollectionUtils.isEmpty(baseDatas)) { + return; + } + for (BaseDataDTO baseData : baseDatas) { + CompiledScript compiledScript = recScriptEngine.compile(ScriptTypeEnum.valueOf(baseData.getScriptType()), baseData.getScriptContent()); + baseData.setCompiledScript(compiledScript); + } + } + + /** + * 编译执行脚本 + * + * @param dataSources dataSources + */ + private void compileDataSourceScript(List dataSources) { + if (CollectionUtils.isEmpty(dataSources)) { + return; + } + for (DataSourceDTO dataSource : dataSources) { + DataSourceTypeEnum sourceType = DataSourceTypeEnum.valueOf(dataSource.getDataSourceType()); + if (sourceType == DataSourceTypeEnum.SCRIPT) { + DataSourceDTO.ScriptInfo scriptInfo = dataSource.getScriptInfo(); + scriptInfo.setCompiledScript(recScriptEngine.compile(ScriptTypeEnum.valueOf(scriptInfo.getScriptType()), scriptInfo.getScriptContent())); + } + } + } + + /** + * 获取域 + * + * @param domainCode domainCode + * @return 返回域 + */ + public DomainDTO getDomain(String domainCode) { + return Optional // + .ofNullable(ENGINE_REPOSITORY_CONFIG.get(domainCode)) // + .map(EngineRepository::getDomainRepository) // + .orElse(null); + } + + /** + * 获取基础数据 + * + * @param domainCode domainCode + * @param uuid uuid + * @return 返回基础数据 + */ + public BaseDataDTO getBaseData(String domainCode, String uuid) { + return Optional // + .ofNullable(ENGINE_REPOSITORY_CONFIG.get(domainCode)) // + .map(EngineRepository::getBaseDataRepository) // + .orElse(Maps.newHashMap()) // + .get(uuid); + } + + /** + * 获取元数据 + * + * @param domainCode domainCode + * @param uuid uuid + * @return 返回元数据 + */ + public MetadataDTO getMetadata(String domainCode, String uuid) { + return Optional // + .ofNullable(ENGINE_REPOSITORY_CONFIG.get(domainCode)) // + .map(EngineRepository::getMetadataRepository) // + .orElse(Maps.newHashMap()) // + .get(uuid); + } + + /** + * 获取数据源 + * + * @param domainCode domainCode + * @param uuid uuid + * @return 返回数据源 + */ + public DataSourceDTO getDataSource(String domainCode, String uuid) { + return Optional // + .ofNullable(ENGINE_REPOSITORY_CONFIG.get(domainCode)) // + .map(EngineRepository::getDataSourceRepository) // + .orElse(Maps.newHashMap()) // + .get(uuid); + } + + /** + * 获取策略 + * + * @param domainCode domainCode + * @param sceneCode sceneCode + * @return 返回策略 + */ + public StrategyDTO getStrategy(String domainCode, String sceneCode) { + return Optional // + .ofNullable(ENGINE_REPOSITORY_CONFIG.get(domainCode)) // + .map(EngineRepository::getStrategyRepository) // + .orElse(Maps.newHashMap()) // + .get(new DomainSceneKey(domainCode, sceneCode)); + } +} diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/DataSourceSPI.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/DataSourceSPI.java index e102c3884da367eb5a8468cb79359b442be6c149..36209b3707f55c67e265ab1d147d442dbea74243 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/DataSourceSPI.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/DataSourceSPI.java @@ -9,13 +9,4 @@ import cn.icanci.rec.engine.sdk.extensions.RecSpi; */ @RecSpi public interface DataSourceSPI extends RecSupportSPI { - - /** - * 加载数据 - * - * @param domain 域 - * @param uuid uuid - * @return 返回相关的数据 - */ - DataSourceDTO loadOne(String domain,String uuid); } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/StrategySPI.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/StrategySPI.java index 24011e55b6e00cb34d211d325840876b3ac02cde..91e332c44e9e8c31e5b0994b5e99fb351ca9e2b7 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/StrategySPI.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/spi/StrategySPI.java @@ -9,13 +9,4 @@ import cn.icanci.rec.engine.sdk.extensions.RecSpi; */ @RecSpi public interface StrategySPI extends RecSupportSPI { - - /** - * 加载数据 - * - * @param domain 域 - * @param sceneCode sceneCode - * @return 返回相关的数据 - */ - StrategyDTO loadOne(String domain, String sceneCode); } diff --git a/rec-socket/README.md b/rec-socket/README.md deleted file mode 100644 index 34a02075e2ffd03fe8f4538fde4300892c7a62f3..0000000000000000000000000000000000000000 --- a/rec-socket/README.md +++ /dev/null @@ -1,3 +0,0 @@ -#### rec-socket - -- TODO \ No newline at end of file diff --git a/rec-socket/pom.xml b/rec-socket/pom.xml deleted file mode 100644 index 6c0d71826bd39329b2b09c117bbb45df7a030bcc..0000000000000000000000000000000000000000 --- a/rec-socket/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - rec-parent - cn.icanci.rec - ${revision} - - 4.0.0 - - rec-socket - pom - - rec-socket-client - rec-socket-server - - - - 8 - 8 - - - \ No newline at end of file diff --git a/rec-socket/rec-socket-client/pom.xml b/rec-socket/rec-socket-client/pom.xml deleted file mode 100644 index 8769c99050b9a4326963e31a684ed6721fa008d3..0000000000000000000000000000000000000000 --- a/rec-socket/rec-socket-client/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - rec-socket - cn.icanci.rec - ${revision} - - 4.0.0 - - rec-socket-client - - - 8 - 8 - - - \ No newline at end of file diff --git a/rec-socket/rec-socket-server/pom.xml b/rec-socket/rec-socket-server/pom.xml deleted file mode 100644 index afe11a4bba915ba8d02e1a2e9ba0c6d4f091d3a0..0000000000000000000000000000000000000000 --- a/rec-socket/rec-socket-server/pom.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - rec-socket - cn.icanci.rec - ${revision} - - 4.0.0 - - rec-socket-server - - - 8 - 8 - - - \ No newline at end of file diff --git a/rec-spi/pom.xml b/rec-spi/pom.xml index 511f9dd725fda80049b6e09c4d04be7eb6e13afd..90c449f3dc69c9517c02cc8b136f57daab4bbe9b 100644 --- a/rec-spi/pom.xml +++ b/rec-spi/pom.xml @@ -5,7 +5,7 @@ rec-parent cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0 diff --git a/rec-spring-boot-starter/pom.xml b/rec-spring-boot-starter/pom.xml index 10d2d9c13a9bb9f2298423d71d886eb0f94cd8ec..fd710b8a05de148f64d63ba66fb0c477a1e83d4d 100644 --- a/rec-spring-boot-starter/pom.xml +++ b/rec-spring-boot-starter/pom.xml @@ -5,7 +5,7 @@ rec-parent cn.icanci.rec - ${revision} + 0.0.0.1-SNAPSHOT 4.0.0