feat:规则引擎(数据源接入,测试)

master_fei
Yunfei Du 2024-05-14 21:26:05 +08:00
parent f91ab4522c
commit 7dcbe492a5
40 changed files with 1301 additions and 77 deletions

View File

@ -20,4 +20,14 @@ public class ServiceNameConstants {
* serviceid
*/
public static final String FILE_SERVICE = "etl-file";
/**
*
*/
public static final String DATA_SOURCE_SERVICE = "etl-data-source";
/**
*
*/
public static final String DATA_RULE_ENGINE_SERVICE = "etl-data-rule-engine";
}

View File

@ -1,8 +1,9 @@
package com.etl.data.client.config;
import com.etl.data.client.jdbcUtils.JDBCConcreteClass;
import com.etl.data.domain.DataSource;
import com.etl.data.domain.config.DataSourceConfig;
import com.etl.data.domain.dataSource.DataSourceConfig;
import com.etl.data.domain.req.DataSourceQueryReq;
import com.etl.data.source.remote.RemoteDataSourceService;
import lombok.extern.log4j.Log4j2;
@ -10,13 +11,16 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import java.util.HashMap;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import java.util.List;
/**
* 访
* @author YunFei.Du
* @date 14:10 2024/5/10
* 访
*
* @author YunFei.Du
* @date 14:10 2024/5/10
*/
@Log4j2
public class DataAccessClientRunner implements ApplicationRunner {
@ -26,18 +30,27 @@ public class DataAccessClientRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
try {
List< DataSource > dataSourceList = remoteDataSourceService.getDataSourceList ( new DataSourceQueryReq () ).getData ( ).getRows ( );
HashMap< String, javax.sql.DataSource > hashMap = new HashMap<> ( );
for (DataSource dataSource : dataSourceList) {
List< DataSource > dataSourceList = remoteDataSourceService.getDataSourceList ( new DataSourceQueryReq ( ) ).getData ( ).getRows ( );
try {
dataSourceList.stream ( ).forEach ( dataSource -> {
log.info ( "dataSource:{}", dataSource );
javax.sql.DataSource dataSource1 = DataSourceConfig.dataSource ( dataSource.getHost ( ), dataSource.getDatabaseName ( ), dataSource.getPort ( ), dataSource.getUsername ( ), dataSource.getPassword ( ) );
log.info ( "dataSource111:{}", dataSource1 );
hashMap.put ( dataSource.getName ( ), dataSource1 );
DataSourceConfig.init ( dataSource );
} );
String key = dataSourceList.get ( 0 ).getName ( ) + dataSourceList.get ( 0 ).getId ( );
DataSourceConfig.getNum ( key );
Connection connection = DataSourceConfig.getConnection ( key );
JDBCConcreteClass jdbcConcreteClass = new JDBCConcreteClass ( );
PreparedStatement preparedStatement = jdbcConcreteClass.getPreparedStatement ( connection, "select * from car" );
ResultSetMetaData rsd = preparedStatement.getMetaData ( );
for (int i = 1; i <= rsd.getColumnCount ( ); i++) {
log.info ( "类型:{}", rsd.getColumnClassName ( i ) );
}
DataSourceConfig.close ( connection );
DataSourceConfig.getNum ( key );
} catch (Exception e) {
log.error ( "失败了" );
log.error ( "数据访问客户端运行程序异常:{}", e.getMessage ( ) );
throw new RuntimeException ( e );
}
}
}

View File

@ -0,0 +1,21 @@
package com.etl.data.client.jdbcUtils;
import org.springframework.stereotype.Component;
import javax.xml.bind.annotation.XmlAccessorOrder;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* jdbc
* @author YunFei.Du
* @date 15:34 2024/5/14
*/
@Component
public abstract class JDBCAbstractClass {
public abstract PreparedStatement getPreparedStatement(Connection connection, String sql);
}

View File

@ -0,0 +1,27 @@
package com.etl.data.client.jdbcUtils;
import lombok.extern.log4j.Log4j2;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* jdbc
* @author YunFei.Du
* @date 15:36 2024/5/14
*/
@Log4j2
public class JDBCConcreteClass extends JDBCAbstractClass{
@Override
public PreparedStatement getPreparedStatement(Connection connection,String sql) {
try {
PreparedStatement preparedStatement = connection.prepareStatement ( sql );
log.info ( "查询结果:" + preparedStatement );
return preparedStatement;
} catch (SQLException e) {
throw new RuntimeException ( e );
}
}
}

View File

@ -0,0 +1,81 @@
package com.etl.data.domain.dataSource;
import com.alibaba.druid.pool.DruidDataSource;
import com.etl.data.domain.DataSource;
import lombok.extern.log4j.Log4j2;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
/**
*
* @author YunFei.Du
* @date 9:09 2024/5/14
*/
@Log4j2
public class DataSourceConfig {
private static HashMap<String,DruidDataSource> dataSourceMap= new HashMap<> ();
/**
*
* @param dataSource JDBC
*/
public static void init(DataSource dataSource) {
// 创建Druid数据源实例
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUsername(dataSource.getUsername ());
druidDataSource.setPassword(dataSource.getPassword());
druidDataSource.setUrl ( "jdbc:mysql://"+dataSource.getHost ( )+":"+dataSource.getPort ( )+"/"+dataSource.getDatabaseName ( ) );
druidDataSource.setDriverClassName ( dataSource.getJdbcDriver () );
// 设置初始化连接数和最小空闲连接数
druidDataSource.setInitialSize ( Integer.valueOf ( dataSource.getInitNum () ) );
druidDataSource.setMinIdle ( Integer.valueOf ( dataSource.getInitNum () ) );
// 设置最大活动连接数
druidDataSource.setMaxActive ( Integer.valueOf ( dataSource.getMaxNum () ) );
try {
//初始化连接池
druidDataSource.init();
} catch (SQLException e) {
log.error ( "初始化数据源失败" );
}
// 将数据源实例添加到dataSourceMap中以名称+ID作为键
dataSourceMap.put(dataSource.getName ()+dataSource.getId(), druidDataSource);
}
/**
*
* @param key
*/
public static void getNum(String key) {
DruidDataSource druidDataSource = dataSourceMap.get ( key );
log.info(key + "正在使用连接" + druidDataSource.getActiveCount () + "个,线程数量:" + druidDataSource.getPoolingCount () + "个");
}
public static Connection getConnection(String key) {
DruidDataSource druidDataSource = dataSourceMap.get ( key );
if (druidDataSource != null){
try {
return druidDataSource.getConnection ( );
} catch (SQLException e) {
throw new RuntimeException ( e );
}
}
return null;
}
/**
*
* @param connection
*/
public static void close(Connection connection) {
try {
connection.close ();
} catch (SQLException e) {
log.error ( "释放连接失败" );
}
}
}

View File

@ -0,0 +1,84 @@
package com.etl.data.domain.dataSource;
import com.alibaba.druid.pool.DruidDataSource;
import com.etl.data.domain.DataSource;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
/**
*
* @author YunFei.Du
* @date 15:23 2024/5/13
*/
@Component
@Log4j2
public class MyDataSource {
private static HashMap<String, DruidDataSource > polls=new HashMap<> ( );
/**
*
*/
public static void info(List< DataSource> dataSourceList){
for (DataSource dataSource : dataSourceList) {
String jdbUrl ="jdbc:"+dataSource.getJdbcDriver()+"://"+dataSource.getHost()+":"+dataSource.getPort()+"/"+dataSource.getDatabaseName();
String key=dataSource.getId ()+"_"+dataSource.getName ();
//创建德鲁伊数据库连接池
DruidDataSource druidSource = new DruidDataSource ( );
druidSource.setUrl ( jdbUrl );
druidSource.setUsername ( dataSource.getUsername () );
druidSource.setPassword ( dataSource.getPassword () );
druidSource.setInitialSize ( Integer.valueOf ( dataSource.getInitNum () ) );
druidSource.setMinIdle ( Integer.valueOf ( dataSource.getMaxNum ()) );
druidSource.setMaxActive ( Integer.valueOf ( dataSource.getMaxNum ()) );
try {
druidSource.init ();
} catch (SQLException e) {
throw new RuntimeException ( e );
}
addDataSource ( key,druidSource );
}
}
private static void addDataSource(String key, DruidDataSource druidSource) {
if (!polls.containsKey ( key )){
polls.put ( key,druidSource );
}
}
/**
* 使getConnection()
* @param key
* @return
*/
public static Connection getConnection(String key) {
//根据key获取连接池
DruidDataSource druidDataSource = polls.get ( key );
if (druidDataSource!=null){
try {
return druidDataSource.getConnection ();
} catch (SQLException e) {
throw new RuntimeException ( e );
}
}
return null;
}
/**
*
*/
public static void close(Connection connection) {
if (connection!=null){
try {
connection.close ();
} catch (SQLException e){
log.error ( "释放连接失败" );
}
}
}
}

View File

@ -0,0 +1,28 @@
package com.etl.data.unit.service.impl;/**
* @ClassName A
* @Description
* @Author YunFei Du
* @Date 2024/05/13 15:01
*/
import com.etl.data.unit.service.Basic;
import com.etl.data.unit.domain.DataModel;
import com.etl.data.unit.domain.TreadConstant;
/**
*A
*
* YunFei Du
*2024/05/13 15:01
*/
public class A implements Basic {
public void show(){
DataModel dataModel = TreadConstant.get();
System.out.println(dataModel.getValue());
}
@Override
public void execution() {
DataModel dataModel = TreadConstant.get();
System.out.println(dataModel.getValue());
}
}

View File

@ -0,0 +1,29 @@
package com.etl.data.unit.service.impl;/**
* @ClassName B
* @Description
* @Author YunFei Du
* @Date 2024/05/13 15:01
*/
import com.etl.data.unit.service.Basic;
import com.etl.data.unit.domain.DataModel;
import com.etl.data.unit.domain.TreadConstant;
/**
*B
*
* YunFei Du
*2024/05/13 15:01
*/
public class B implements Basic {
public void udp(){
DataModel dataModel = TreadConstant.get();
dataModel.setValue("李四");
}
@Override
public void execution() {
DataModel dataModel = TreadConstant.get();
dataModel.setValue("李四");
}
}

View File

@ -0,0 +1,36 @@
package com.etl.data.unit.service.impl;/**
* @ClassName C
* @Description
* @Author YunFei Du
* @Date 2024/05/13 15:01
*/
import com.etl.data.unit.service.Basic;
import com.etl.data.unit.domain.DataModel;
import com.etl.data.unit.domain.TreadConstant;
/**
*C
*
* YunFei Du
*2024/05/13 15:01
*/
public class C implements Basic {
public void eq(){
DataModel dataModel = TreadConstant.get();
if ("张三".equals(dataModel.getValue())){
System.out.println("是张三");
}else{
System.out.println(String.format("不是张三,而是%s",dataModel.getValue()));
}
}
@Override
public void execution() {
DataModel dataModel = TreadConstant.get();
if ("张三".equals(dataModel.getValue())){
System.out.println("是张三");
}else{
System.out.println(String.format("不是张三,而是%s",dataModel.getValue()));
}
}
}

View File

@ -0,0 +1,13 @@
package com.etl.rule.engine.ClassLoading;
/**
* @ClassName CustomClassLoader
* @Description
* @Author YunFei.Du
* @Date 2024/5/1 19:37
*/
public class CustomClassLoader extends ClassLoader {
public Class<?> defineClassFromBytes(String name, byte[] data) {
return defineClass(name, data, 0, data.length);
}
}

View File

@ -0,0 +1,14 @@
package com.etl.rule.engine;
/**
* @Author: YunFei.Du
* @date: 2024/5/6
* @Description:
* @Version: 1.0
*/
public interface Engine<V> {
public void execution();
public V get();
}

View File

@ -0,0 +1,72 @@
package com.etl.rule.engine.constant;
import com.etl.common.security.utils.SecurityUtils;
import com.etl.rule.engine.domain.EngineMaintenance;
import com.etl.rule.engine.domain.RuleEngineVersion;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @ClassName GenerateConstant
* @Description
* @Author YunFei.Du
* @Date 2024/5/7 19:45
*/
@Component
public class GenerateConstant {
public static final String DATA_FIELD = "DataModelEngine";
public static final String DATA_RECORD = "RecordEngine";
public static final String DATA_SET = "DataSetEngine";
public static final String ACTION_IMPORT = "import com.etl.rule.engine.action.ActionDiscard;\n";
public static final String SCOPE_IMPORT = "import com.etl.rule.engine.scope.";
public static final String PACKAGE_PATH = "package com.etl.rule.engine.custom;";
public static String getClassName(String versionCode){
String[] splits = versionCode.split("_");
String className="";
for (String split : splits) {
className += split.substring(0,1).toUpperCase()+split.substring(1);
}
return className;
}
public static String generateConstant(EngineMaintenance engineMaintenance, RuleEngineVersion engineVersion){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String format = simpleDateFormat.format(new Date());
String level = selectType(engineMaintenance.getLevel());
return PACKAGE_PATH+"\n\n" +
ACTION_IMPORT +
SCOPE_IMPORT+level+";\n" +
"\n" +
"/**\n" +
" * @Author: "+ SecurityUtils.getUsername() +"\n" +
" * @date: "+format+"\n" +
" * @Description: "+engineVersion.getName()+engineVersion.getCode()+"\n" +
" * @Version: 1.0\n" +
" */\n" +
"public class "+getClassName(engineVersion.getVersionCode())+" extends "+level+" {\n" +
" @Override\n" +
" public void execution () {\n" +
" }\n" +
"}";
}
public static String selectType(String level){
String type = "";
switch (level) {
case "data-field":
type = DATA_FIELD;
break;
case "data-record":
type = DATA_RECORD;
break;
case "data-set":
type = DATA_SET;
break;
}
return type;
}
}

View File

@ -0,0 +1,7 @@
package com.etl.rule.engine.constant;
public class PathConstant {
public static final String JAVA_PATH = "D:\\projects\\shixun\\fei-cloud-service\\etl-modules\\etl-rule-engine\\etl-rule-engine-common\\src\\main\\java\\com\\etl\\rule\\engine\\custom\\";
public static final String CLASS_PATH = "D:\\projects\\shixun\\fei-cloud-service\\etl-modules\\etl-rule-engine\\etl-rule-engine-common\\target\\classes\\";
public static final String PACKAGE_PATH_SERVICE = "com.etl.rule.engine.custom";
}

View File

@ -0,0 +1,63 @@
package com.etl.rule.engine.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.etl.common.core.web.domain.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.List;
/**
*
* @author ruoyi
* @date 2024-05-02
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@TableName("engine_maintenance")
public class EngineMaintenance extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/** 规则引擎名称 */
private String name;
/** 规则引擎类型 */
private String type;
/** 规则引擎激活状态 */
private String isActivate;
/** 规则引擎状态 */
private String status;
/** 规则引擎描述 */
private String description;
/** 规则引擎编码 */
private String code;
/** 编码*/
private String engineCode;
/** 规则引擎级别 */
private String level;
/** 编辑代码文本 */
private String codeText;
}

View File

@ -0,0 +1,75 @@
package com.etl.rule.engine.domain.resp;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.etl.common.core.web.domain.BaseEntity;
import com.etl.rule.engine.domain.EngineMaintenance;
import com.etl.rule.engine.domain.RuleEngineVersion;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.List;
/**
* @ClassName EngineMaintenanceResq
* @Description
* @Author YunFei.Du
* @Date 2024/5/7 14:42
*/
@Data
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
public class EngineMaintenanceResp extends BaseEntity {
/**
*
*/
@TableId(value = "id",type = IdType.AUTO)
private Long id;
/** 规则引擎名称 */
private String name;
/** 规则引擎类型 */
private String type;
/** 规则引擎激活状态 */
private String isActivate;
/** 规则引擎状态 */
private String status;
/** 规则引擎描述 */
private String description;
/** 规则引擎编码 */
private String code;
/** 编码*/
private String engineCode;
/** 规则引擎级别 */
private String level;
/** 编辑代码文本 */
private String codeText;
/** 规则版本列表*/
private List< RuleEngineVersion > ruleEngineVersionList;
public static EngineMaintenanceResp engineMaintenanceBuild(EngineMaintenance engineMaintenance, List< RuleEngineVersion > ruleEngineVersionList) {
return EngineMaintenanceResp.builder ()
.id (engineMaintenance.getId ())
.name (engineMaintenance.getName ())
.type (engineMaintenance.getType ())
.isActivate (engineMaintenance.getIsActivate ())
.status (engineMaintenance.getStatus ())
.description (engineMaintenance.getDescription ())
.code (engineMaintenance.getCode ())
.engineCode (engineMaintenance.getEngineCode ())
.level (engineMaintenance.getLevel ())
.codeText (engineMaintenance.getCodeText ())
.ruleEngineVersionList (ruleEngineVersionList)
.build ();
}
}

View File

@ -0,0 +1,39 @@
package com.etl.rule.engine.model;
import lombok.Data;
/**
* @Author: DongZeLiang
* @date: 2024/5/5
* @Description:
* @Version: 1.0
*/
@Data
public class DataModel {
/**
*
*/
private String key;
/**
*
*/
private Object value;
/**
* -
*/
private String sourceType;
/**
* -
*/
private String processType;
/**
*
*/
private Class<?> processClass;
}

View File

@ -0,0 +1,30 @@
package com.etl.rule.engine.model;
/**
* @Author: DongZeLiang
* @date: 2024/5/5
* @Description:
* @Version: 1.0
*/
public class DataSetModel {
// [[DataModel,DataModel,DataModel],[DataModel,DataModel,DataModel]]
private RecordModel[] recordModelArr = null;
private DataSetModel(int recordModelLength){
recordModelArr = new RecordModel[recordModelLength];
}
private DataSetModel(RecordModel[] recordModelArr){
recordModelArr = recordModelArr;
}
public static DataSetModel build(int recordModelLength){
return new DataSetModel(recordModelLength);
}
public static DataSetModel build(RecordModel[] recordModelArr){
return new DataSetModel(recordModelArr);
}
}

View File

@ -0,0 +1,11 @@
package com.etl.rule.engine.model;
/**
* @Author: DongZeLiang
* @date: 2024/5/5
* @Description:
* @Version: 1.0
*/
public interface DataStandard {
}

View File

@ -0,0 +1,31 @@
package com.etl.rule.engine.model;
import lombok.Data;
/**
* @Author: DongZeLiang
* @date: 2024/5/5
* @Description:
* @Version: 1.0
*/
@Data
public class RecordModel {
// [DataModel,DataModel,DataModel]
private RecordModel(int dataModelLength){
this.dataModelArr = new DataModel[dataModelLength];
}
private RecordModel(DataModel[] dataModelArr){
this.dataModelArr = dataModelArr;
}
private DataModel[] dataModelArr = null;
public static RecordModel build(int dataModelLength){
return new RecordModel(dataModelLength);
}
public static RecordModel build(DataModel[] dataModelArr){
return new RecordModel(dataModelArr);
}
}

View File

@ -0,0 +1,37 @@
package com.etl.rule.engine.scope;
import com.etl.rule.engine.scope.model.DataProcessModel;
import org.springframework.stereotype.Component;
/**
* @Author: YunFei.Du
* @date: 2024/4/29
* @Description:
* @Version: 1.0
*/
@Component
public class DataModelContext implements ScopeContext <DataProcessModel>{
private static final ThreadLocal<DataProcessModel> THREAD_LOCAL = new ThreadLocal<>();
private final RecordContext recordContext;
public DataModelContext (RecordContext recordContext) {
this.recordContext = recordContext;
}
@Override
public DataProcessModel get () {
return THREAD_LOCAL.get();
}
@Override
public void set (DataProcessModel dataProcessModel) {
THREAD_LOCAL.set(dataProcessModel);
}
@Override
public void clear(){
THREAD_LOCAL.remove();
}
}

View File

@ -0,0 +1,47 @@
package com.etl.rule.engine.scope;
import com.etl.rule.engine.Engine;
import com.etl.rule.engine.model.DataModel;
import com.etl.rule.engine.scope.model.DataProcessModel;
/**
* @Author: YunFei.Du
* @date: 2024/5/6
* @Description:
* @Version: 1.0
*/
public abstract class DataModelEngine implements Engine<DataProcessModel> {
private DataModelContext dataModelContext;
@Override
public DataProcessModel get (){
return dataModelContext.get();
}
public DataModel getModel(){
return get().getDataModel();
}
public String getKey () {
return getModel().getKey();
}
public Object getValue () {
return getModel().getValue();
}
public String getSourceType () {
return getModel().getSourceType();
}
public String getProcessType () {
return getModel().getProcessType();
}
public Class<?> getProcessClass () {
return getModel().getProcessClass();
}
}

View File

@ -0,0 +1,38 @@
package com.etl.rule.engine.scope;
import com.etl.rule.engine.scope.model.DataSetProcessModel;
import org.springframework.stereotype.Component;
/**
* @Author: YunFei.Du
* @date: 2024/4/29
* @Description:
* @Version: 1.0
*/
@Component
public class DataSetContext implements ScopeContext <DataSetProcessModel>{
private static final ThreadLocal<DataSetProcessModel> THREAD_LOCAL = new ThreadLocal<>();
private final TaskContext taskContext;
public DataSetContext (TaskContext taskContext) {
this.taskContext = taskContext;
}
@Override
public DataSetProcessModel get() {
return THREAD_LOCAL.get();
}
@Override
public void clear() {
THREAD_LOCAL.remove();
}
@Override
public void set(DataSetProcessModel dataSetProcessModel) {
THREAD_LOCAL.set(dataSetProcessModel);
}
}

View File

@ -0,0 +1,31 @@
package com.etl.rule.engine.scope;
import com.etl.rule.engine.Engine;
import com.etl.rule.engine.model.DataSetModel;
import com.etl.rule.engine.scope.model.DataSetProcessModel;
/**
* @Author: YunFei.Du
* @date: 2024/5/6
* @Description:
* @Version: 1.0
*/
public abstract class DataSetEngine implements Engine<DataSetProcessModel> {
private DataSetContext dataSetContext;
@Override
public DataSetProcessModel get() {
return dataSetContext.get();
}
public DataSetModel getDataSetModel() {
return get().getDataSetModel();
}
public DataSetContext getDataSetContext() {
return dataSetContext;
}
public void setDataSetContext(DataSetContext dataSetContext) {
this.dataSetContext = dataSetContext;
}
}

View File

@ -0,0 +1,35 @@
package com.etl.rule.engine.scope;
import com.etl.rule.engine.scope.model.RecordProcessModel;
/**
* @Author: YunFei.Du
* @date: 2024/4/29
* @Description: /
* @Version: 1.0
*/
public class RecordContext implements ScopeContext<RecordProcessModel>{
private static final ThreadLocal<RecordProcessModel> THREAD_LOCAL = new ThreadLocal<>();
private final DataSetContext dataSetContext;
private RecordContext (DataSetContext dataSetContext) {
this.dataSetContext = dataSetContext;
}
@Override
public RecordProcessModel get() {
return THREAD_LOCAL.get();
}
@Override
public void clear() {
THREAD_LOCAL.remove();
}
@Override
public void set(RecordProcessModel recordProcessModel) {
THREAD_LOCAL.set(recordProcessModel);
}
}

View File

@ -0,0 +1,19 @@
package com.etl.rule.engine.scope;
import com.etl.rule.engine.Engine;
import com.etl.rule.engine.scope.model.RecordProcessModel;
/**
* @Author: YunFei.Du
* @date: 2024/5/6
* @Description:
* @Version: 1.0
*/
public abstract class RecordEngine implements Engine<RecordProcessModel> {
private RecordContext recordContext;
@Override
public RecordProcessModel get() {
return null;
}
}

View File

@ -0,0 +1,15 @@
package com.etl.rule.engine.scope;
/**
* @Author: YunFei.Du
* @date: 2024/5/6
* @Description:
* @Version: 1.0
*/
public interface ScopeContext<V> {
V get();
void clear();
void set(V v);
}

View File

@ -0,0 +1,14 @@
package com.etl.rule.engine.scope;
/**
* @Author: YunFei.Du
* @date: 2024/4/29
* @Description:
* @Version: 1.0
*/
public class TaskContext {
public static TaskContext build(){
return new TaskContext();
}
}

View File

@ -0,0 +1,16 @@
package com.etl.rule.engine.scope.model;
import com.etl.rule.engine.model.DataModel;
import lombok.Data;
/**
* @Author: YunFei.Du
* @date: 2024/5/5
* @Description:
* @Version: 1.0
*/
@Data
public class DataProcessModel {
private DataModel dataModel;
}

View File

@ -0,0 +1,16 @@
package com.etl.rule.engine.scope.model;
import com.etl.rule.engine.model.DataSetModel;
import lombok.Data;
/**
* @Author: YunFei.Du
* @date: 2024/5/5
* @Description:
* @Version: 1.0
*/
@Data
public class DataSetProcessModel {
private DataSetModel dataSetModel;
}

View File

@ -0,0 +1,18 @@
package com.etl.rule.engine.scope.model;
import com.etl.rule.engine.model.RecordModel;
import lombok.Data;
/**
* @Author: YunFei.Du
* @date: 2024/5/5
* @Description:
* @Version: 1.0
*/
@Data
public class RecordProcessModel {
private String[] keys;
private RecordModel recordModel;
}

View File

@ -1,4 +1,4 @@
package com.etl;
package com.etl.rule.engine;
import com.etl.common.security.annotation.EnableCustomConfig;
import com.etl.common.security.annotation.EnableMyFeignClients;

View File

@ -6,7 +6,9 @@ import com.etl.common.core.web.controller.BaseController;
import com.etl.common.core.web.page.TableDataInfo;
import com.etl.common.log.annotation.Log;
import com.etl.common.log.enums.BusinessType;
import com.etl.rule.engine.domain.EngineMaintenance;
import com.etl.rule.engine.domain.resp.EngineMaintenanceResp;
import com.etl.rule.engine.service.IEngineMaintenanceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@ -15,10 +17,9 @@ import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* Controller
*
* @author ruoyi
* @date 2024-05-02
*
* @author YunFei.Du
* @date 20:20 2024/5/6
*/
@RestController
@RequestMapping("/maintenance")
@ -28,30 +29,46 @@ public class EngineMaintenanceController extends BaseController
private IEngineMaintenanceService engineMaintenanceService;
/**
*
*
* @param engineMaintenance
* @return
*/
@PostMapping("ActivateEngine")
public Result activateEngine(@RequestBody EngineMaintenance engineMaintenance )
{
return engineMaintenanceService.activateEngine(engineMaintenance);
}
/**
*
*/
/**
*
*/
@GetMapping("/list")
public Result<TableDataInfo<EngineMaintenance>> list(EngineMaintenance engineMaintenance)
public Result<TableDataInfo< EngineMaintenanceResp >> list(EngineMaintenance engineMaintenance)
{
startPage();
List<EngineMaintenance> list = engineMaintenanceService.selectEngineMaintenanceList(engineMaintenance);
List<EngineMaintenanceResp> list = engineMaintenanceService.selectEngineMaintenanceList(engineMaintenance);
return getDataAsset ( list );
}
/**
*
*/
@Log(title = "【请填写功能名称】", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, EngineMaintenance engineMaintenance)
{
List<EngineMaintenance> list = engineMaintenanceService.selectEngineMaintenanceList(engineMaintenance);
ExcelUtil<EngineMaintenance> util = new ExcelUtil<EngineMaintenance>(EngineMaintenance.class);
util.exportExcel(response, list, "【请填写功能名称】数据");
}
// /**
// * 导出引擎维护 列表
// */
// @Log(title = "引擎维护 ", businessType = BusinessType.EXPORT)
// @PostMapping("/export")
// public void export(HttpServletResponse response, EngineMaintenance engineMaintenance)
// {
// List<EngineMaintenanceResp> list = engineMaintenanceService.selectEngineMaintenanceList(engineMaintenance);
// ExcelUtil<EngineMaintenance> util = new ExcelUtil<EngineMaintenance>(EngineMaintenance.class);
// util.exportExcel(response, list, "引擎维护 数据");
// }
/**
*
*
*/
@GetMapping(value = "/{id}")
public Result getInfo(@PathVariable("id") Long id)
@ -71,9 +88,9 @@ public class EngineMaintenanceController extends BaseController
}
/**
*
*
*/
@Log(title = "【请填写功能名称】", businessType = BusinessType.INSERT)
@Log(title = "引擎维护 ", businessType = BusinessType.INSERT)
@PostMapping
public Result add(@RequestBody EngineMaintenance engineMaintenance)
{
@ -90,22 +107,25 @@ public class EngineMaintenanceController extends BaseController
}
/**
*
*
*/
@Log(title = "【请填写功能名称】", businessType = BusinessType.UPDATE)
@Log(title = "引擎维护 ", businessType = BusinessType.UPDATE)
@PutMapping
public Result edit(@RequestBody EngineMaintenance engineMaintenance)
{
return toAjax(engineMaintenanceService.updateEngineMaintenance(engineMaintenance));
return engineMaintenanceService.updateEngineMaintenance(engineMaintenance);
}
/**
*
*
*/
@Log(title = "【请填写功能名称】", businessType = BusinessType.DELETE)
@Log(title = "引擎维护 ", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public Result remove(@PathVariable Long[] ids)
{
return toAjax(engineMaintenanceService.deleteEngineMaintenanceByIds(ids));
}
}

View File

@ -21,6 +21,7 @@ import java.util.List;
@RestController
@RequestMapping("version")
public class RuleEngineVersionController {
@Autowired
private IRuleEngineVersionService ruleEngineVersionService;

View File

@ -0,0 +1,14 @@
package com.etl.rule.engine.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.etl.rule.engine.domain.EngineMaintenance;
/**
* @ClassName EngineMaintenanceMapper
* @Description
* @Author YunFei.Du
* @Date 2024/5/6 20:51
*/
public interface EngineMaintenanceMapper extends BaseMapper< EngineMaintenance > {
}

View File

@ -0,0 +1,11 @@
package com.etl.rule.engine.scope;
/**
* @ClassName DataModelEngine
* @Description
* @Author YunFei.Du
* @Date 2024/5/14 18:36
*/
public class DataModelEngine {
}

View File

@ -0,0 +1,75 @@
package com.etl.rule.engine.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.etl.common.core.domain.Result;
import com.etl.rule.engine.domain.EngineMaintenance;
import com.etl.rule.engine.domain.resp.EngineMaintenanceResp;
import java.util.List;
/**
* Service
*
* @author ruoyi
* @date 2024-05-02
*/
public interface IEngineMaintenanceService extends IService< EngineMaintenance>
{
/**
*
*
* @param id
* @return
*/
public EngineMaintenanceResp selectEngineMaintenanceById(Long id);
/**
*
*
* @param engineMaintenance
* @return
*/
public List< EngineMaintenanceResp > selectEngineMaintenanceList(EngineMaintenance engineMaintenance);
/**
*
*
* @param engineMaintenance
* @return
*/
public int insertEngineMaintenance(EngineMaintenance engineMaintenance);
/**
*
*
* @param engineMaintenance
* @return
*/
public Result updateEngineMaintenance(EngineMaintenance engineMaintenance);
/**
*
*
* @param ids
* @return
*/
public int deleteEngineMaintenanceByIds(Long[] ids);
/**
*
*
* @param id
* @return
*/
public int deleteEngineMaintenanceById(Long id);
/**
*
*/
Result initializeRuleEngine(EngineMaintenance engineMaintenance);
Result testMethod(String code);
Result activateEngine(EngineMaintenance engineMaintenance);
}

View File

@ -0,0 +1,18 @@
package com.etl.rule.engine.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.etl.rule.engine.domain.RuleEngineVersion;
import java.util.List;
/**
* @ClassName RuleEngineVersionService
* @Description
* @Author YunFei.Du
* @Date 2024/5/6 20:55
*/
public interface IRuleEngineVersionService extends IService< RuleEngineVersion > {
}

View File

@ -1,13 +1,21 @@
package com.etl.rule.engine.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.etl.common.core.domain.Result;
import com.etl.common.core.utils.DateUtils;
import com.etl.common.security.utils.SecurityUtils;
import com.etl.rule.engine.ClassLoading.CustomClassLoader;
import com.etl.rule.engine.domain.EngineMaintenance;
import com.etl.rule.engine.domain.RuleEngineVersion;
import com.etl.rule.engine.domain.resp.EngineMaintenanceResp;
import com.etl.rule.engine.mapper.EngineMaintenanceMapper;
import com.etl.rule.engine.service.IEngineMaintenanceService;
import com.etl.rule.engine.service.IRuleEngineVersionService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -19,50 +27,58 @@ import java.io.FileWriter;
import java.lang.reflect.Method;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Service
* Service
*
* @author ruoyi
* @date 2024-05-02
*/
@Service
@Log4j2
public class EngineMaintenanceServiceImpl implements IEngineMaintenanceService
{
public class EngineMaintenanceServiceImpl extends ServiceImpl<EngineMaintenanceMapper, EngineMaintenance> implements IEngineMaintenanceService {
@Autowired
private EngineMaintenanceMapper engineMaintenanceMapper;
private IRuleEngineVersionService ruleEngineVersionService;
/**
*
*
*
* @param id
* @return
* @param id
* @return
*/
@Override
public EngineMaintenance selectEngineMaintenanceById(Long id)
{
return engineMaintenanceMapper.selectEngineMaintenanceById(id);
public EngineMaintenanceResp selectEngineMaintenanceById(Long id) {
EngineMaintenance engineMaintenance = this.getById ( id );
List< RuleEngineVersion > engineVersions = ruleEngineVersionService.list ( new LambdaQueryWrapper< RuleEngineVersion > ( ).in ( RuleEngineVersion::getEngineMaintenanceId, engineMaintenance.getId ( ) ) );
return EngineMaintenanceResp.engineMaintenanceBuild ( engineMaintenance, engineVersions );
}
/**
*
*
*
* @param engineMaintenance
* @return
* @param engineMaintenance
* @return
*/
@Override
public List<EngineMaintenance> selectEngineMaintenanceList(EngineMaintenance engineMaintenance)
{
return engineMaintenanceMapper.selectEngineMaintenanceList(engineMaintenance);
public List< EngineMaintenanceResp > selectEngineMaintenanceList(EngineMaintenance engineMaintenance) {
ArrayList< EngineMaintenanceResp > engineMaintenanceList = new ArrayList<> ( );
List< EngineMaintenance > list = this.list ( );
for (EngineMaintenance maintenance : list) {
List< RuleEngineVersion > engineVersions = ruleEngineVersionService.list ( new LambdaQueryWrapper< RuleEngineVersion > ( ).in ( RuleEngineVersion::getEngineMaintenanceId, maintenance.getId ( ) ) );
EngineMaintenanceResp engineMaintenanceResp1 = EngineMaintenanceResp.engineMaintenanceBuild ( maintenance, engineVersions );
engineMaintenanceList.add ( engineMaintenanceResp1 );
}
return engineMaintenanceList;
}
/**
*
*
*
* @param engineMaintenance
* @param engineMaintenance
* @return
*/
@Override
@ -74,46 +90,65 @@ public class EngineMaintenanceServiceImpl implements IEngineMaintenanceService
engineMaintenance.setCodeText("package com.etl.rule.engine.domain;\n\n\n"+
"public class " + className + " {\n" +
"}");
return engineMaintenanceMapper.insertEngineMaintenance(engineMaintenance);
boolean save = this.save ( engineMaintenance );
if (save){
return 1;
}
return 0;
}
/**
*
* @param engineMaintenance
*
* @param engineMaintenance
* @return
*/
@Override
public int updateEngineMaintenance(EngineMaintenance engineMaintenance)
{
engineMaintenance.setUpdateTime(DateUtils.getNowDate());
engineMaintenance.setUpdateBy(SecurityUtils.getUsername());
return engineMaintenanceMapper.updateEngineMaintenance(engineMaintenance);
public Result updateEngineMaintenance(EngineMaintenance engineMaintenance) {
boolean update = this.update ( new LambdaUpdateWrapper< EngineMaintenance > ( )
.set ( EngineMaintenance::getIsActivate, engineMaintenance.getIsActivate () )
.set ( EngineMaintenance::getStatus, engineMaintenance.getStatus () )
.set ( EngineMaintenance::getUpdateTime, DateUtils.getNowDate ( ) )
.set ( EngineMaintenance::getUpdateBy, SecurityUtils.getUsername ( ) )
.eq ( EngineMaintenance::getId, engineMaintenance.getId ( )));
if (update?true:false){
return Result.success ();
}else {
return Result.error ();
}
}
/**
*
*
*
* @param ids
* @param ids
* @return
*/
@Override
public int deleteEngineMaintenanceByIds(Long[] ids)
{
return engineMaintenanceMapper.deleteEngineMaintenanceByIds(ids);
public int deleteEngineMaintenanceByIds(Long[] ids) {
boolean b = this.removeBatchByIds ( Arrays.asList ( ids ) );
if (b){
return 1;
}else {
return 0;
}
}
/**
*
*
*
* @param id
* @param id
* @return
*/
@Override
public int deleteEngineMaintenanceById(Long id)
{
return engineMaintenanceMapper.deleteEngineMaintenanceById(id);
public int deleteEngineMaintenanceById(Long id) {
boolean b = this.removeById ( id );
if (b){
return 1;
}else {
return 0;
}
}
@Override
public Result initializeRuleEngine(EngineMaintenance engineMaintenance) {
try {
@ -195,4 +230,9 @@ public class EngineMaintenanceServiceImpl implements IEngineMaintenanceService
}
return Result.success("测试成功");
}
@Override
public Result activateEngine(EngineMaintenance engineMaintenance) {
return null;
}
}

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 -->
<property name="log.path" value="logs/etl-system"/>
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.etl" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<root level="info">
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>

View File

@ -15,6 +15,7 @@
<module>etl-file</module>
<module>etl-data-source</module>
<module>etl-rule-engine</module>
<module>etl-data-unit</module>
</modules>
<artifactId>etl-modules</artifactId>