feat: 执行器runner基本搭建完成

This commit is contained in:
2025-04-05 20:15:37 +08:00
parent a3a48f8e67
commit f05cd6c54c
31 changed files with 231 additions and 47 deletions

View File

@@ -1,7 +1,7 @@
package com.metis.domain.bo;
import com.metis.enums.YesOrNoEnum;
import com.metis.flow.domain.entity.Graph;
import com.metis.flow.domain.bo.Graph;
import lombok.Data;
@Data

View File

@@ -2,8 +2,8 @@ package com.metis.facade;
import com.metis.domain.bo.ProcessBo;
import com.metis.flow.domain.entity.App;
import com.metis.flow.domain.entity.CreateApp;
import com.metis.flow.domain.entity.UpdateApp;
import com.metis.flow.domain.bo.CreateApp;
import com.metis.flow.domain.bo.UpdateApp;
import com.metis.flow.engine.AppEngineService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

View File

@@ -1,6 +1,9 @@
package com.metis.flow.convert;
import com.metis.flow.domain.entity.*;
import com.metis.flow.domain.bo.BuildApp;
import com.metis.flow.domain.bo.CreateApp;
import com.metis.flow.domain.bo.UpdateApp;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@@ -29,8 +32,8 @@ public interface BaseAppConvert {
* @return {@link App }
*/
@Mappings({
@Mapping(target = "graph", expression = "java(com.alibaba.fastjson2.JSON.parseObject(baseApp.getGraphJson(), com.metis.flow.domain.entity.Graph.class))"),
@Mapping(target = "deploymentId", source = "id")
@Mapping(target = "graph", expression = "java(com.alibaba.fastjson2.JSON.parseObject(baseApp.getGraphJson(), com.metis.flow.domain.entity.bo.Graph.class))"),
@Mapping(target = "workflowId", source = "id")
})
App toApp(BaseApp baseApp);

View File

@@ -1,4 +1,4 @@
package com.metis.flow.domain.entity;
package com.metis.flow.domain.bo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;

View File

@@ -1,4 +1,4 @@
package com.metis.flow.domain.entity;
package com.metis.flow.domain.bo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;

View File

@@ -1,4 +1,4 @@
package com.metis.flow.domain.entity;
package com.metis.flow.domain.bo;
import com.metis.flow.domain.entity.base.Edge;
import com.metis.flow.domain.entity.base.Node;

View File

@@ -1,4 +1,4 @@
package com.metis.flow.domain.entity;
package com.metis.flow.domain.bo;
import com.metis.enums.YesOrNoEnum;
import jakarta.validation.Valid;

View File

@@ -0,0 +1,19 @@
package com.metis.flow.domain.context;
import com.alibaba.fastjson2.JSONObject;
import lombok.Data;
@Data
public class RunningContext {
/**
* 系统数据
*/
private SysContext sys;
/**
* 自定义数据
*/
private JSONObject custom;
}

View File

@@ -0,0 +1,19 @@
package com.metis.flow.domain.context;
import lombok.Data;
import java.util.List;
@Data
public class SysContext {
private List<String> file;
private Long appId;
private Long userId;
private Long workflowId;
private Long instanceId;
}

View File

@@ -2,6 +2,7 @@ package com.metis.flow.domain.entity;
import com.metis.enums.YesOrNoEnum;
import com.metis.flow.domain.bo.Graph;
import lombok.Data;
import java.time.LocalDateTime;
@@ -17,7 +18,7 @@ public class App {
/**
* 部署id
*/
private Long deploymentId;
private Long workflowId;
/**
* 名称

View File

@@ -1,5 +1,7 @@
package com.metis.flow.domain.entity.base;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.metis.flow.enums.NodeType;
import jakarta.validation.Valid;
@@ -8,9 +10,10 @@ import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.Map;
import java.util.stream.Collectors;
@Data
public class Node<T> {
public class Node {
/**
* id
@@ -36,16 +39,23 @@ public class Node<T> {
*/
@Valid
@NotNull(message = "节点业务数据不能为空")
private NodeData<T> data;
private NodeData data;
@JsonIgnore
public Map<String, Handle> getHandleMap() {
if (data == null || data.getHandles() == null) {
if (CollUtil.isEmpty(data.getHandles())) {
return Map.of();
}
return data.getHandles().stream().collect(java.util.stream.Collectors.toMap(Handle::getId, handle -> handle));
return data.getHandles().stream().collect(Collectors.toMap(Handle::getId, handle -> handle));
}
@JsonIgnore
public <T> T getConfig() {
if (ObjectUtil.isNull(data.getConfig())) {
return null;
}
return (T) data.getConfig().to(type.getConfigClass());
}
}

View File

@@ -1,5 +1,6 @@
package com.metis.flow.domain.entity.base;
import com.alibaba.fastjson2.JSONObject;
import com.metis.flow.enums.PositionType;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
@@ -9,7 +10,7 @@ import lombok.Data;
import java.util.List;
@Data
public class NodeData<T> {
public class NodeData {
/**
* 标签
@@ -29,7 +30,7 @@ public class NodeData<T> {
/**
* 配置
*/
private T config;
private JSONObject config;
/**
* 句柄列表

View File

@@ -1 +0,0 @@
package com.metis.flow.domain;

View File

@@ -1,4 +1,4 @@
package com.metis.flow.domain;
package com.metis.flow.domain.query;
import lombok.Builder;
import lombok.Data;

View File

@@ -0,0 +1,4 @@
package com.metis.flow.engine;
public interface AppEngineRunnerService {
}

View File

@@ -1,9 +1,9 @@
package com.metis.flow.engine;
import com.metis.flow.domain.AppQuery;
import com.metis.flow.domain.query.AppQuery;
import com.metis.flow.domain.entity.App;
import com.metis.flow.domain.entity.CreateApp;
import com.metis.flow.domain.entity.UpdateApp;
import com.metis.flow.domain.bo.CreateApp;
import com.metis.flow.domain.bo.UpdateApp;
import java.util.List;

View File

@@ -6,7 +6,10 @@ import cn.hutool.core.util.ObjectUtil;
import com.metis.enums.YesOrNoEnum;
import com.metis.flow.constant.BaseConstant;
import com.metis.flow.convert.BaseAppConvert;
import com.metis.flow.domain.AppQuery;
import com.metis.flow.domain.bo.BuildApp;
import com.metis.flow.domain.bo.CreateApp;
import com.metis.flow.domain.bo.UpdateApp;
import com.metis.flow.domain.query.AppQuery;
import com.metis.flow.domain.entity.*;
import com.metis.flow.engine.AppEngineService;
import com.metis.flow.service.BaseAppService;
@@ -109,7 +112,7 @@ public class AppEngineServiceImpl implements AppEngineService {
private App creatApp(BaseApp baseApp, BuildApp buildApp) {
App app = BaseAppConvert.INSTANCE.toApp(buildApp);
app.setId(baseApp.getId());
app.setDeploymentId(baseApp.getId());
app.setWorkflowId(baseApp.getId());
app.setDefaultUse(baseApp.getDefaultUse());
return app;
}

View File

@@ -11,8 +11,8 @@ import java.util.Arrays;
@AllArgsConstructor
public enum NodeType {
START(1, "start", "开始"),
END(2, "end", "结束"),
START(1, "start", "开始", Object.class),
END(2, "end", "结束", Object.class),
;
@@ -24,6 +24,8 @@ public enum NodeType {
private final String name;
private final Class<?> configClass;
/**
* 枚举序列化器(前端传code时自动转换为对应枚举)

View File

@@ -0,0 +1,27 @@
package com.metis.flow.runner;
import com.metis.flow.domain.context.RunningContext;
import com.metis.flow.domain.entity.base.Node;
import com.metis.flow.enums.NodeType;
public interface NodeRunner {
/**
* 运行
*
* @param context 上下文
* @param node 节点配置信息
* @return {@link RunningContext }
*/
RunningContext run(RunningContext context, Node node);
/**
* 获取节点类型
*
* @return {@link NodeType }
*/
NodeType getType();
}

View File

@@ -0,0 +1,22 @@
package com.metis.flow.runner;
import com.metis.flow.runner.factory.RunnerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class RunnerInitialize implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, NodeRunner> runnerMap = applicationContext.getBeansOfType(NodeRunner.class);
runnerMap.forEach((k, v) -> {
RunnerFactory.register(v);
});
}
}

View File

@@ -0,0 +1,36 @@
package com.metis.flow.runner.factory;
import com.metis.flow.enums.NodeType;
import com.metis.flow.runner.NodeRunner;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class RunnerFactory {
private static final Map<NodeType, NodeRunner> MAP = new ConcurrentHashMap<>(8);
/**
* 注册
*
* @param runner 跑步者
*/
public static void register(NodeRunner runner) {
MAP.put(runner.getType(), runner);
}
/**
* 得到
*
* @param type 类型
* @return {@link NodeRunner }
*/
public static NodeRunner get(NodeType type) {
return MAP.get(type);
}
}

View File

@@ -0,0 +1,25 @@
package com.metis.flow.runner.impl;
import com.metis.flow.domain.context.RunningContext;
import com.metis.flow.domain.entity.base.Node;
import com.metis.flow.enums.NodeType;
import com.metis.flow.runner.NodeRunner;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class EndNodeRunner implements NodeRunner {
@Override
public RunningContext run(RunningContext context, Node node) {
return context;
}
@Override
public NodeType getType() {
return NodeType.END;
}
}

View File

@@ -0,0 +1,23 @@
package com.metis.flow.runner.impl;
import com.metis.flow.domain.context.RunningContext;
import com.metis.flow.domain.entity.base.Node;
import com.metis.flow.enums.NodeType;
import com.metis.flow.runner.NodeRunner;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class StartNodeRunner implements NodeRunner {
@Override
public RunningContext run(RunningContext context, Node node) {
return context;
}
@Override
public NodeType getType() {
return NodeType.START;
}
}

View File

@@ -1,7 +1,7 @@
package com.metis.flow.service;
import com.metis.enums.YesOrNoEnum;
import com.metis.flow.domain.AppQuery;
import com.metis.flow.domain.query.AppQuery;
import com.metis.flow.domain.entity.BaseApp;
import com.baomidou.mybatisplus.extension.service.IService;

View File

@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.metis.enums.YesOrNoEnum;
import com.metis.flow.domain.AppQuery;
import com.metis.flow.domain.query.AppQuery;
import com.metis.flow.domain.entity.BaseApp;
import com.metis.flow.mapper.BaseAppMapper;
import com.metis.flow.service.BaseAppService;

View File

@@ -3,7 +3,7 @@ package com.metis.flow.validator;
import com.metis.flow.domain.entity.base.Node;
import com.metis.flow.enums.NodeType;
public interface NodeValidator<T> {
public interface NodeValidator {
/**
@@ -12,7 +12,7 @@ public interface NodeValidator<T> {
* @param node 节点
* @return {@link ValidatorResult }
*/
ValidatorResult validate(Node<T> node);
ValidatorResult validate(Node node);
/**

View File

@@ -1,6 +1,6 @@
package com.metis.flow.validator;
import com.metis.flow.domain.entity.BuildApp;
import com.metis.flow.domain.bo.BuildApp;
public interface ValidatorService {

View File

@@ -2,14 +2,11 @@ package com.metis.flow.validator.factory;
import com.metis.flow.enums.EdgeType;
import com.metis.flow.validator.EdgeValidator;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class EdgeValidatorFactory implements ApplicationContextAware {
public class EdgeValidatorFactory {
private static final Map<EdgeType, EdgeValidator> MAP = new ConcurrentHashMap<>(8);
@@ -32,11 +29,4 @@ public class EdgeValidatorFactory implements ApplicationContextAware {
return MAP.get(type);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, EdgeValidator> validatorMap = applicationContext.getBeansOfType(EdgeValidator.class);
validatorMap.forEach((k, v) -> {
register(v);
});
}
}

View File

@@ -3,8 +3,8 @@ package com.metis.flow.validator.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import com.metis.flow.domain.entity.BuildApp;
import com.metis.flow.domain.entity.Graph;
import com.metis.flow.domain.bo.BuildApp;
import com.metis.flow.domain.bo.Graph;
import com.metis.flow.domain.entity.base.Edge;
import com.metis.flow.domain.entity.base.Node;
import com.metis.flow.enums.EdgeType;

View File

@@ -9,10 +9,10 @@ import org.springframework.stereotype.Service;
@Slf4j
@Service
public class EndNodeValidator implements NodeValidator<Object> {
public class EndNodeValidator implements NodeValidator {
@Override
public ValidatorResult validate(Node<Object> node) {
public ValidatorResult validate(Node node) {
return ValidatorResult.valid();
}

View File

@@ -9,10 +9,10 @@ import org.springframework.stereotype.Service;
@Slf4j
@Service
public class StartNodeValidator implements NodeValidator<Object> {
public class StartNodeValidator implements NodeValidator {
@Override
public ValidatorResult validate(Node<Object> node) {
public ValidatorResult validate(Node node) {
return ValidatorResult.valid();
}