diff --git a/README.md b/README.md
index 4911ae945861ebb6e056493861cd7da4b9e94f8f..f4dc9683bd57cab904a3f84d047901662d37493d 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 ee286da00456b2a5e112216fef93102b2d2c782a..938cb02b907050d86ca4696c35531f4e00f3526c 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 bd78aef50cd3f5ad94b5f02c1abc0069e372089d..dec82fb1a946bebd65312088bfd49630a5b5d9ba 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 adb0519e08b7ae5081da983262fd90f5eced9de4..c4425e87aba1ac1ef8c88b2804683137c19a1cff 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 a4b72024ada32d58b46899218f76f15dfa1d9994..d1466622fe43dedcfe3db1c308c92ecc4bf5a0a0 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 db0bc12c576f739d83a7aa608353edbf83e2a205..c386bb22f85086fe202d140684dd16af27628f69 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 77c37f0f6983afbe2f5386f40313bc83a58f2d22..7bad7af3c69a7fe489f2453f89bea76027c86788 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,16 +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.*;
import java.lang.reflect.Field;
@@ -23,6 +16,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 +27,7 @@ import com.google.common.collect.Sets;
*/
@Configuration
+@ComponentScan({ "cn.icanci.rec.engine.sdk" })
//@ConditionalOnClass(RuleAggregationCluster.class)
public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandLineRunner {
/**
@@ -45,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();
- }
-
/**
* 执行引擎
*
@@ -75,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
*
@@ -233,16 +168,6 @@ public class RecEngineSDKAutoConfig implements ApplicationContextAware, CommandL
}
}
- /**
- * scriptExecutorPoolHolder
- *
- * @return scriptExecutorPoolHolder
- */
- @Bean("scriptExecutorPoolHolder")
- public ScriptExecutorPoolHolder scriptExecutorPoolHolder() {
- return ScriptExecutorPoolHolder.getInstance();
- }
-
@Override
public void run(String... args) throws Exception {
// no op
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 e025011a5c681e3f9293660963e7ebef40425d6e..96628858013c8baa29dfdcbad692a59a6d080869 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 f769892d90719ccfa7da6a9e43f3594e1c6689ff..304f987b2ba3a98ffb5e8d6e67ba068a58115d6d 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 ed30f363dee22c5c6d4b520945c5080fa2ead9a2..fe1cae344058f0f5768390f0dfa2f641455a8c88 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();
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 31f265d943b9f73f8023c059f71be84ff33145a2..0122b49c2919476291df2d286aaa19bd3fbabf2d 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