feat:规则引擎客户端新增规则引擎服务类

dev
gtl 2024-05-15 21:43:20 +08:00
parent 7462c6b251
commit 8408d8f9a6
35 changed files with 227 additions and 119 deletions

View File

@ -19,13 +19,6 @@ public class ConnectionPoolContextHolder {
*/
private final Map<Long, DruidDataSource> druidDataSourceMap=new ConcurrentHashMap<>(16);
/**
*
*/
public Map<Long,DruidDataSource> getMap(){
return this.druidDataSourceMap;
}
/**
*
*/
@ -46,4 +39,11 @@ public class ConnectionPoolContextHolder {
public boolean hasKey(Long id){
return this.druidDataSourceMap.containsKey(id);
}
/**
*
*/
public void remove(Long id){
this.druidDataSourceMap.remove(id);
}
}

View File

@ -32,7 +32,7 @@ public class ConnectionPoolService {
public void init(List<DataSource> dataSourceList){
for (DataSource dataSource : dataSourceList) {
try {
connectionPoolContextHolder.put(dataSource.getId(), createDataSource(dataSource));
this.put(dataSource);
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}

View File

@ -1,6 +1,6 @@
package com.ruoyi.dataTransform.domain.req;
import com.ruoyi.ruleEngine.client.model.DataModel;
import com.ruoyi.ruleEngine.client.engine.model.DataModel;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@ -1,6 +1,6 @@
package com.ruoyi.dataTransform.util;
import com.ruoyi.ruleEngine.client.model.DataModel;
import com.ruoyi.ruleEngine.client.engine.model.DataModel;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

View File

@ -2,8 +2,7 @@ package com.ruoyi.dataTransform.consumer;
import com.alibaba.fastjson2.JSON;
import com.rabbitmq.client.Channel;
import com.ruoyi.ruleEngine.client.config.RuleEngineVersionFactory;
import com.ruoyi.ruleEngine.client.util.RuleEngineUtil;
import com.ruoyi.ruleEngine.client.service.RuleEngineService;
import com.ruoyi.ruleEngine.constant.QueueNameConstants;
import com.ruoyi.ruleEngine.domain.EngineVersion;
import lombok.extern.log4j.Log4j2;
@ -15,7 +14,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Map;
/**
*
@ -31,7 +29,7 @@ public class EngineVersionConsumer {
private RedisTemplate<String, String> redisTemplate;
@Autowired
private RuleEngineVersionFactory ruleEngineVersionFactory;
private RuleEngineService ruleEngineService;
@Autowired
private MessageConverter messageConverter;
@ -47,12 +45,10 @@ public class EngineVersionConsumer {
String messageId = message.getMessageProperties().getMessageId();
try {
Long count = redisTemplate.opsForSet().add(QueueNameConstants.VERSION_MESSAGE, messageId);
if (count > 0) {
if (count != null&&count > 0) {
// 正常消费消息
// 编译
Map<String, byte[]> bytecode = RuleEngineUtil.compileVersion(engineVersion);
// 新增或替换规则内容
ruleEngineVersionFactory.put(engineVersion.getId(),bytecode);
ruleEngineService.put(engineVersion);
// 消费成功 手动确认
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
log.info("引擎版本消费者接收到消息,消息内容:{},消费消息成功!", JSON.toJSONString(engineVersion));

View File

@ -4,7 +4,7 @@ import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.dataTransform.domain.req.RandomDataReq;
import com.ruoyi.dataTransform.service.DataExtractService;
import com.ruoyi.ruleEngine.client.model.DataModel;
import com.ruoyi.ruleEngine.client.engine.model.DataModel;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -1,7 +1,7 @@
package com.ruoyi.dataTransform.service;
import com.ruoyi.dataTransform.domain.req.RandomDataReq;
import com.ruoyi.ruleEngine.client.model.DataModel;
import com.ruoyi.ruleEngine.client.engine.model.DataModel;
import java.util.List;
/**

View File

@ -5,7 +5,7 @@ import com.ruoyi.dataAsset.service.ConnectionPoolService;
import com.ruoyi.dataTransform.domain.req.RandomDataReq;
import com.ruoyi.dataTransform.service.DataExtractService;
import com.ruoyi.dataTransform.util.DataExtractUtil;
import com.ruoyi.ruleEngine.client.model.DataModel;
import com.ruoyi.ruleEngine.client.engine.model.DataModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

View File

@ -4,20 +4,20 @@ import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.dataTransform.domain.req.TestDataReq;
import com.ruoyi.dataTransform.service.EngineOperationService;
import com.ruoyi.ruleEngine.client.config.RuleEngineVersionFactory;
import com.ruoyi.ruleEngine.client.context.DataModelContextHolder;
import com.ruoyi.ruleEngine.client.context.DataSetContextHolder;
import com.ruoyi.ruleEngine.client.context.RecordContextHolder;
import com.ruoyi.ruleEngine.client.engine.context.DataModelContextHolder;
import com.ruoyi.ruleEngine.client.engine.context.DataSetContextHolder;
import com.ruoyi.ruleEngine.client.engine.context.RecordContextHolder;
import com.ruoyi.ruleEngine.client.dynamicLoad.DynamicLoader;
import com.ruoyi.ruleEngine.client.engine.action.ActionRecords;
import com.ruoyi.ruleEngine.client.engine.action.ActionRemove;
import com.ruoyi.ruleEngine.client.engine.action.ActionReplace;
import com.ruoyi.ruleEngine.client.model.DataModel;
import com.ruoyi.ruleEngine.client.model.DataSetModel;
import com.ruoyi.ruleEngine.client.model.RecordModel;
import com.ruoyi.ruleEngine.client.model.process.DataModelProcessModel;
import com.ruoyi.ruleEngine.client.model.process.DataSetProcessModel;
import com.ruoyi.ruleEngine.client.model.process.RecordProcessModel;
import com.ruoyi.ruleEngine.client.engine.model.DataModel;
import com.ruoyi.ruleEngine.client.engine.model.DataSetModel;
import com.ruoyi.ruleEngine.client.engine.model.RecordModel;
import com.ruoyi.ruleEngine.client.engine.model.process.DataModelProcessModel;
import com.ruoyi.ruleEngine.client.engine.model.process.DataSetProcessModel;
import com.ruoyi.ruleEngine.client.engine.model.process.RecordProcessModel;
import com.ruoyi.ruleEngine.client.service.RuleEngineService;
import com.ruoyi.ruleEngine.remote.RemoteRuleEngineService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -40,7 +40,7 @@ import java.util.Objects;
public class EngineOperationServiceImpl implements EngineOperationService {
@Autowired
private RuleEngineVersionFactory ruleEngineVersionFactory;
private RuleEngineService ruleEngineService;
@Autowired
private RemoteRuleEngineService remoteRuleEngineService;
@ -75,7 +75,7 @@ public class EngineOperationServiceImpl implements EngineOperationService {
}
StringBuffer actionRecords=null;
// 获取版本对应class文件的字节数组
Map<String, byte[]> bytecode = ruleEngineVersionFactory.get(testDataReq.getVersionId());
Map<String, byte[]> bytecode = ruleEngineService.get(testDataReq.getVersionId());
try {
//执行引擎
actionRecords=this.engineExecute(bytecode,testDataReq.getVersionClass(), testDataReq.getVersionId());

View File

@ -1,18 +1,15 @@
package com.ruoyi.ruleEngine.client.config;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.ruleEngine.client.util.RuleEngineUtil;
import com.ruoyi.ruleEngine.constant.RuleOperationConstants;
import com.ruoyi.ruleEngine.client.service.RuleEngineService;
import com.ruoyi.ruleEngine.domain.EngineVersion;
import com.ruoyi.ruleEngine.domain.req.EngineVersionQueryReq;
import com.ruoyi.ruleEngine.client.dynamicLoad.DynamicLoader;
import com.ruoyi.ruleEngine.remote.RemoteRuleEngineService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import java.util.List;
import java.util.Map;
/**
*
@ -27,18 +24,13 @@ public class RuleEngineApplicationRunner implements ApplicationRunner {
private RemoteRuleEngineService remoteRuleEngineService;
@Autowired
private RuleEngineVersionFactory ruleEngineVersionFactory;
private RuleEngineService ruleEngineService;
@Override
public void run(ApplicationArguments args) throws Exception {
public void run(ApplicationArguments args) {
Result<List<EngineVersion>> result = remoteRuleEngineService.list(new EngineVersionQueryReq());
if(Result.isSuccess(result)){
result.getData().forEach(engineVersion -> {
// 编译规则内容
Map<String, byte[]> bytecode = RuleEngineUtil.compileVersion(engineVersion);
// 存入工厂
ruleEngineVersionFactory.put(engineVersion.getId(), bytecode);
});
ruleEngineService.init(result.getData());
}
}
}

View File

@ -0,0 +1,16 @@
package com.ruoyi.ruleEngine.client.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
/**
*
* @ClassName RuleEngineVersionFactory
* @Author
* @Date 2024/5/8 19:31
*/
@ComponentScan
@Import(RuleEngineApplicationRunner.class)
public class RuleEngineVersionClientConfig {
}

View File

@ -1,30 +0,0 @@
package com.ruoyi.ruleEngine.client.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import java.util.HashMap;
import java.util.Map;
/**
*
* @ClassName RuleEngineVersionFactory
* @Author
* @Date 2024/5/8 19:31
*/
@ComponentScan
@Import(RuleEngineApplicationRunner.class)
public class RuleEngineVersionFactory {
private final Map<Long,Map<String, byte[]>> versionContentMap=new HashMap<>();
public Map<Long, Map<String, byte[]>> getMap() {
return this.versionContentMap;
}
public void put(Long id,Map<String, byte[]> map) {
this.versionContentMap.put(id,map);
}
public Map<String, byte[]> get(Long id) {
return this.versionContentMap.get(id);
}
}

View File

@ -0,0 +1,48 @@
package com.ruoyi.ruleEngine.client.context;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
*
* @ClassName RuleEngineContextHolder
* @Author GuanTieLin
* @Date 2024/5/15 20:37
*/
@Component
public class RuleEngineContextHolder {
/**
*
*/
private final Map<Long, Map<String, byte[]>> versionContentMap=new ConcurrentHashMap<>(16);
/**
* key
*/
public boolean hasKey(Long id){
return versionContentMap.containsKey(id);
}
/**
*
*/
public void put(Long id,Map<String, byte[]> map) {
this.versionContentMap.put(id,map);
}
/**
*
*/
public Map<String, byte[]> get(Long id) {
return this.versionContentMap.get(id);
}
/**
*
*/
public void remove(Long id) {
this.versionContentMap.remove(id);
}
}

View File

@ -1,6 +1,6 @@
package com.ruoyi.ruleEngine.client.engine.action;
import com.ruoyi.ruleEngine.client.model.DataModel;
import com.ruoyi.ruleEngine.client.engine.model.DataModel;
import lombok.Getter;
import lombok.Setter;

View File

@ -1,6 +1,6 @@
package com.ruoyi.ruleEngine.client.engine.action;
import com.ruoyi.ruleEngine.client.model.DataModel;
import com.ruoyi.ruleEngine.client.engine.model.DataModel;
import lombok.*;
/**

View File

@ -1,10 +1,9 @@
package com.ruoyi.ruleEngine.client.context;
package com.ruoyi.ruleEngine.client.engine.context;
import com.ruoyi.ruleEngine.client.model.process.DataModelProcessModel;
import com.ruoyi.ruleEngine.client.engine.model.process.DataModelProcessModel;
import com.ruoyi.ruleEngine.client.util.RuleEngineUtil;
import lombok.Data;
import lombok.experimental.SuperBuilder;
import java.sql.Connection;
/**

View File

@ -1,6 +1,6 @@
package com.ruoyi.ruleEngine.client.context;
package com.ruoyi.ruleEngine.client.engine.context;
import com.ruoyi.ruleEngine.client.model.process.DataSetProcessModel;
import com.ruoyi.ruleEngine.client.engine.model.process.DataSetProcessModel;
import lombok.Data;
import lombok.experimental.SuperBuilder;

View File

@ -1,6 +1,6 @@
package com.ruoyi.ruleEngine.client.context;
package com.ruoyi.ruleEngine.client.engine.context;
import com.ruoyi.ruleEngine.client.model.process.RecordProcessModel;
import com.ruoyi.ruleEngine.client.engine.model.process.RecordProcessModel;
import lombok.Data;
import lombok.experimental.SuperBuilder;

View File

@ -1,4 +1,4 @@
package com.ruoyi.ruleEngine.client.model;
package com.ruoyi.ruleEngine.client.engine.model;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ruoyi.ruleEngine.client.model;
package com.ruoyi.ruleEngine.client.engine.model;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.ruoyi.ruleEngine.client.model;
package com.ruoyi.ruleEngine.client.engine.model;
import lombok.AllArgsConstructor;
import lombok.Data;

View File

@ -1,6 +1,6 @@
package com.ruoyi.ruleEngine.client.model.process;
package com.ruoyi.ruleEngine.client.engine.model.process;
import com.ruoyi.ruleEngine.client.model.DataModel;
import com.ruoyi.ruleEngine.client.engine.model.DataModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

View File

@ -1,6 +1,6 @@
package com.ruoyi.ruleEngine.client.model.process;
package com.ruoyi.ruleEngine.client.engine.model.process;
import com.ruoyi.ruleEngine.client.model.DataSetModel;
import com.ruoyi.ruleEngine.client.engine.model.DataSetModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

View File

@ -1,6 +1,6 @@
package com.ruoyi.ruleEngine.client.model.process;
package com.ruoyi.ruleEngine.client.engine.model.process;
import com.ruoyi.ruleEngine.client.model.RecordModel;
import com.ruoyi.ruleEngine.client.engine.model.RecordModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

View File

@ -1,9 +1,9 @@
package com.ruoyi.ruleEngine.client.engine.scope;
import com.ruoyi.ruleEngine.client.context.DataModelContextHolder;
import com.ruoyi.ruleEngine.client.engine.context.DataModelContextHolder;
import com.ruoyi.ruleEngine.client.engine.Engine;
import com.ruoyi.ruleEngine.client.model.DataModel;
import com.ruoyi.ruleEngine.client.model.process.DataModelProcessModel;
import com.ruoyi.ruleEngine.client.engine.model.DataModel;
import com.ruoyi.ruleEngine.client.engine.model.process.DataModelProcessModel;
/**
*

View File

@ -1,10 +1,10 @@
package com.ruoyi.ruleEngine.client.engine.scope;
import com.ruoyi.ruleEngine.client.context.DataSetContextHolder;
import com.ruoyi.ruleEngine.client.engine.context.DataSetContextHolder;
import com.ruoyi.ruleEngine.client.engine.Engine;
import com.ruoyi.ruleEngine.client.model.DataSetModel;
import com.ruoyi.ruleEngine.client.model.RecordModel;
import com.ruoyi.ruleEngine.client.model.process.DataSetProcessModel;
import com.ruoyi.ruleEngine.client.engine.model.DataSetModel;
import com.ruoyi.ruleEngine.client.engine.model.RecordModel;
import com.ruoyi.ruleEngine.client.engine.model.process.DataSetProcessModel;
import java.util.List;

View File

@ -1,10 +1,10 @@
package com.ruoyi.ruleEngine.client.engine.scope;
import com.ruoyi.ruleEngine.client.context.RecordContextHolder;
import com.ruoyi.ruleEngine.client.engine.context.RecordContextHolder;
import com.ruoyi.ruleEngine.client.engine.Engine;
import com.ruoyi.ruleEngine.client.model.DataModel;
import com.ruoyi.ruleEngine.client.model.RecordModel;
import com.ruoyi.ruleEngine.client.model.process.RecordProcessModel;
import com.ruoyi.ruleEngine.client.engine.model.DataModel;
import com.ruoyi.ruleEngine.client.engine.model.RecordModel;
import com.ruoyi.ruleEngine.client.engine.model.process.RecordProcessModel;
import java.util.List;

View File

@ -0,0 +1,81 @@
package com.ruoyi.ruleEngine.client.service;
import com.ruoyi.ruleEngine.client.context.RuleEngineContextHolder;
import com.ruoyi.ruleEngine.client.util.RuleEngineUtil;
import com.ruoyi.ruleEngine.domain.EngineVersion;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* @ClassName RuleEngineService
* @Author GuanTieLin
* @Date 2024/5/15 20:36
*/
@Log4j2
@Component
public class RuleEngineService {
@Autowired
private RuleEngineContextHolder ruleEngineContextHolder;
/**
*
* @param engineVersionList
*/
public void init(List<EngineVersion> engineVersionList){
engineVersionList.forEach(this::put);
}
/**
*
* @param engineVersion
*/
public void put(EngineVersion engineVersion){
// 编译规则内容
Map<String, byte[]> bytecode = RuleEngineUtil.compileVersion(engineVersion);
// 存入上下文
ruleEngineContextHolder.put(engineVersion.getId(), bytecode);
}
/**
*
* @param id
*/
public void remove(Long id){
if(hasKey(id)){
ruleEngineContextHolder.remove(id);
}else {
log.error("引擎上下文中不存在key:[{}]",id);
}
}
/**
*
* @param id
* @return
*/
public Map<String,byte[]> get(Long id){
Map<String,byte[]> map=new HashMap<>();
if(hasKey(id)){
map=ruleEngineContextHolder.get(id);
}else {
log.error("引擎上下文中不存在key:[{}]",id);
}
return map;
}
/**
* key
* @param id
* @return
*/
public boolean hasKey(Long id){
return ruleEngineContextHolder.hasKey(id);
}
}

View File

@ -1,11 +1,11 @@
package com.ruoyi.ruleEngine.client.util;
import com.ruoyi.ruleEngine.client.context.DataSetContextHolder;
import com.ruoyi.ruleEngine.client.engine.context.DataSetContextHolder;
import com.ruoyi.ruleEngine.client.dynamicLoad.DynamicLoader;
import com.ruoyi.ruleEngine.client.model.DataModel;
import com.ruoyi.ruleEngine.client.model.DataSetModel;
import com.ruoyi.ruleEngine.client.model.RecordModel;
import com.ruoyi.ruleEngine.client.model.process.DataSetProcessModel;
import com.ruoyi.ruleEngine.client.engine.model.DataModel;
import com.ruoyi.ruleEngine.client.engine.model.DataSetModel;
import com.ruoyi.ruleEngine.client.engine.model.RecordModel;
import com.ruoyi.ruleEngine.client.engine.model.process.DataSetProcessModel;
import com.ruoyi.ruleEngine.constant.RuleOperationConstants;
import com.ruoyi.ruleEngine.domain.EngineVersion;
import java.sql.*;
@ -56,6 +56,11 @@ public class RuleEngineUtil {
DataSetContextHolder.set(dataSetProcessModel);
}
/**
*
* @param engineVersion
* @return class
*/
public static Map<String, byte[]> compileVersion(EngineVersion engineVersion){
// 获取版本内容
String content = engineVersion.getRuleContent().replaceAll("\r\n", "");

View File

@ -1 +1,3 @@
com.ruoyi.ruleEngine.client.config.RuleEngineVersionFactory
com.ruoyi.ruleEngine.client.config.RuleEngineVersionClientConfig
com.ruoyi.ruleEngine.client.context.RuleEngineContextHolder
com.ruoyi.ruleEngine.client.service.RuleEngineService

View File

@ -1,10 +1,9 @@
package com.ruoyi.ruleEngine.client.context;
package com.ruoyi.ruleEngine.client.engine.context;
import com.ruoyi.ruleEngine.client.model.process.DataModelProcessModel;
import com.ruoyi.ruleEngine.client.engine.model.process.DataModelProcessModel;
import com.ruoyi.ruleEngine.client.util.RuleEngineUtil;
import lombok.Data;
import lombok.experimental.SuperBuilder;
import java.sql.Connection;
/**

View File

@ -1,6 +1,6 @@
package com.ruoyi.ruleEngine.client.context;
package com.ruoyi.ruleEngine.client.engine.context;
import com.ruoyi.ruleEngine.client.model.process.DataSetProcessModel;
import com.ruoyi.ruleEngine.client.engine.model.process.DataSetProcessModel;
import lombok.Data;
import lombok.experimental.SuperBuilder;

View File

@ -1,6 +1,6 @@
package com.ruoyi.ruleEngine.client.context;
package com.ruoyi.ruleEngine.client.engine.context;
import com.ruoyi.ruleEngine.client.model.process.RecordProcessModel;
import com.ruoyi.ruleEngine.client.engine.model.process.RecordProcessModel;
import lombok.Data;
import lombok.experimental.SuperBuilder;

View File

@ -1,4 +1,4 @@
package com.ruoyi.ruleEngine.client.context;
package com.ruoyi.ruleEngine.client.engine.context;
/**
* 任务上下文