【递归方式,流程回路检测】

背景:后置流程。例如:task1配置后置流程task2,task3。task3配置后置流程task4

问题:需要解决的问题配置时候防止回路,造成死循环:task1配置后置流程task2,task2配置后置流程task1

bash 复制代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class LoopDetection {

    public static void main(String[] args) {

        List<MyProcess> flowList = new ArrayList<>();
        Integer processId = 1001;
        List<Integer> checkList = new ArrayList<>();
        Map<Integer,MyProcess> postMap = new HashMap<>();
        getAllPostProcess(flowList,processId,checkList,postMap);
        System.out.println("is ok");
    }

    private static MyProcess getProcess(Integer processId){
        // 模拟数据库的数据
        Map<Integer,MyProcess> mockDataBaseMap = new HashMap<>();
        mockDataBaseMap.put(1001,new MyProcess(1001,"process01","1002,1003,1004"));
        mockDataBaseMap.put(1002,new MyProcess(1002,"process02","1003"));
        mockDataBaseMap.put(1003,new MyProcess(1003,"process03","1004"));
        mockDataBaseMap.put(1004,new MyProcess(1004,"process04",null));
        return mockDataBaseMap.get(processId);
    }
    private static void getAllPostProcess(List<MyProcess> flowList, Integer processId, List<Integer> checkList, Map<Integer, MyProcess> postMap){
        MyProcess processById = null;
        if(postMap!=null){
            if(!postMap.containsKey(processId)){
                processById = getProcess(processId);
                postMap.put(processById.getId(),processById);
            }else {
                processById = postMap.get(processId);
            }
        }

        if (processById!=null && processById.getId()!=null){
            flowList.add(processById);
            if (checkList.contains(processId)){
                throw new RuntimeException("0,后置流程中存在死循环");
            }
            checkList.add(processId);
            if (!"".equals(processById.getPostProcess()) && processById.getPostProcess()!=null){
                for (String flowIdstr : processById.getPostProcess().split(",")) {
                    getAllPostProcess(flowList,Integer.parseInt(flowIdstr),checkList,postMap);
                }
            }
            checkList.remove(processId);
        }
    }
}

class MyProcess{
    private Integer id;
    private String name;
    private String postProcess;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPostProcess() {
        return postProcess;
    }

    public void setPostProcess(String postProcess) {
        this.postProcess = postProcess;
    }

    public MyProcess(Integer id, String name, String postProcess) {
        this.id = id;
        this.name = name;
        this.postProcess = postProcess;
    }
}
相关推荐
?re?ta?rd?ed?10 小时前
C++11新特性,{}与左值
c++·windows
必须得开心呀13 小时前
windows10系统任务栏图标消失修复
windows
zl_dfq13 小时前
Windows 下 UDP 套接字编程指南
网络·windows·udp
学习论之费曼学习法14 小时前
无人值守AI内容矩阵实战(10):Windows 上让 Python 进程 7×24 活着
人工智能·windows·python·矩阵·powershell·进程守护
少年的范儿14 小时前
Windows 安装 MySQL 8.4 教程(ZIP 解压版):配置 my.ini、初始化数据库与启动服务
数据库·windows·mysql
胖纸不争15 小时前
EnergyStarZ:让 Windows 后台进程给前台让路的能效管理器(v1.2 发布)
windows·性能优化·c#·win32·ef core
2501_9159090616 小时前
Windows 上用 VS Code 调试 iPhone 真机 App,KXBuild 断点、崩溃定位实操
ide·windows·vscode·ios·iphone·个人开发·敏捷流程
情 九17 小时前
MCP 开发环境搭建:Mac 与 Windows 跑通 Python 服务和 stdio 客户端
windows·python·macos·mcp
懂点Tech1 天前
ctfshow misc28:GIF 高度修改解题与脚本实现
开发语言·windows·python
云梦谭1 天前
让 Linux 主动连接 Windows:配置 Windows 11 SSH 服务端
linux·windows·ssh