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; package com.metis.domain.bo;
import com.metis.enums.YesOrNoEnum; import com.metis.enums.YesOrNoEnum;
import com.metis.flow.domain.entity.Graph; import com.metis.flow.domain.bo.Graph;
import lombok.Data; import lombok.Data;
@Data @Data

View File

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

View File

@@ -1,6 +1,9 @@
package com.metis.flow.convert; package com.metis.flow.convert;
import com.metis.flow.domain.entity.*; 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.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;
import org.mapstruct.Mappings; import org.mapstruct.Mappings;
@@ -29,8 +32,8 @@ public interface BaseAppConvert {
* @return {@link App } * @return {@link App }
*/ */
@Mappings({ @Mappings({
@Mapping(target = "graph", expression = "java(com.alibaba.fastjson2.JSON.parseObject(baseApp.getGraphJson(), com.metis.flow.domain.entity.Graph.class))"), @Mapping(target = "graph", expression = "java(com.alibaba.fastjson2.JSON.parseObject(baseApp.getGraphJson(), com.metis.flow.domain.entity.bo.Graph.class))"),
@Mapping(target = "deploymentId", source = "id") @Mapping(target = "workflowId", source = "id")
}) })
App toApp(BaseApp baseApp); 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.Valid;
import jakarta.validation.constraints.NotBlank; 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.Valid;
import jakarta.validation.constraints.NotBlank; 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.Edge;
import com.metis.flow.domain.entity.base.Node; 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 com.metis.enums.YesOrNoEnum;
import jakarta.validation.Valid; 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.enums.YesOrNoEnum;
import com.metis.flow.domain.bo.Graph;
import lombok.Data; import lombok.Data;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@@ -17,7 +18,7 @@ public class App {
/** /**
* 部署id * 部署id
*/ */
private Long deploymentId; private Long workflowId;
/** /**
* 名称 * 名称

View File

@@ -1,5 +1,7 @@
package com.metis.flow.domain.entity.base; 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.fasterxml.jackson.annotation.JsonIgnore;
import com.metis.flow.enums.NodeType; import com.metis.flow.enums.NodeType;
import jakarta.validation.Valid; import jakarta.validation.Valid;
@@ -8,9 +10,10 @@ import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
@Data @Data
public class Node<T> { public class Node {
/** /**
* id * id
@@ -36,16 +39,23 @@ public class Node<T> {
*/ */
@Valid @Valid
@NotNull(message = "节点业务数据不能为空") @NotNull(message = "节点业务数据不能为空")
private NodeData<T> data; private NodeData data;
@JsonIgnore @JsonIgnore
public Map<String, Handle> getHandleMap() { public Map<String, Handle> getHandleMap() {
if (data == null || data.getHandles() == null) { if (CollUtil.isEmpty(data.getHandles())) {
return Map.of(); 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; package com.metis.flow.domain.entity.base;
import com.alibaba.fastjson2.JSONObject;
import com.metis.flow.enums.PositionType; import com.metis.flow.enums.PositionType;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@@ -9,7 +10,7 @@ import lombok.Data;
import java.util.List; import java.util.List;
@Data @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.Builder;
import lombok.Data; 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; 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.App;
import com.metis.flow.domain.entity.CreateApp; import com.metis.flow.domain.bo.CreateApp;
import com.metis.flow.domain.entity.UpdateApp; import com.metis.flow.domain.bo.UpdateApp;
import java.util.List; import java.util.List;

View File

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

View File

@@ -11,8 +11,8 @@ import java.util.Arrays;
@AllArgsConstructor @AllArgsConstructor
public enum NodeType { public enum NodeType {
START(1, "start", "开始"), START(1, "start", "开始", Object.class),
END(2, "end", "结束"), END(2, "end", "结束", Object.class),
; ;
@@ -24,6 +24,8 @@ public enum NodeType {
private final String name; private final String name;
private final Class<?> configClass;
/** /**
* 枚举序列化器(前端传code时自动转换为对应枚举) * 枚举序列化器(前端传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; package com.metis.flow.service;
import com.metis.enums.YesOrNoEnum; 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.domain.entity.BaseApp;
import com.baomidou.mybatisplus.extension.service.IService; 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.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.metis.enums.YesOrNoEnum; 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.domain.entity.BaseApp;
import com.metis.flow.mapper.BaseAppMapper; import com.metis.flow.mapper.BaseAppMapper;
import com.metis.flow.service.BaseAppService; 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.domain.entity.base.Node;
import com.metis.flow.enums.NodeType; import com.metis.flow.enums.NodeType;
public interface NodeValidator<T> { public interface NodeValidator {
/** /**
@@ -12,7 +12,7 @@ public interface NodeValidator<T> {
* @param node 节点 * @param node 节点
* @return {@link ValidatorResult } * @return {@link ValidatorResult }
*/ */
ValidatorResult validate(Node<T> node); ValidatorResult validate(Node node);
/** /**

View File

@@ -1,6 +1,6 @@
package com.metis.flow.validator; package com.metis.flow.validator;
import com.metis.flow.domain.entity.BuildApp; import com.metis.flow.domain.bo.BuildApp;
public interface ValidatorService { 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.enums.EdgeType;
import com.metis.flow.validator.EdgeValidator; 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.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
public class EdgeValidatorFactory implements ApplicationContextAware { public class EdgeValidatorFactory {
private static final Map<EdgeType, EdgeValidator> MAP = new ConcurrentHashMap<>(8); private static final Map<EdgeType, EdgeValidator> MAP = new ConcurrentHashMap<>(8);
@@ -32,11 +29,4 @@ public class EdgeValidatorFactory implements ApplicationContextAware {
return MAP.get(type); 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.collection.CollUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.metis.flow.domain.entity.BuildApp; import com.metis.flow.domain.bo.BuildApp;
import com.metis.flow.domain.entity.Graph; import com.metis.flow.domain.bo.Graph;
import com.metis.flow.domain.entity.base.Edge; import com.metis.flow.domain.entity.base.Edge;
import com.metis.flow.domain.entity.base.Node; import com.metis.flow.domain.entity.base.Node;
import com.metis.flow.enums.EdgeType; import com.metis.flow.enums.EdgeType;

View File

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

View File

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