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

背景:后置流程。例如: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;
    }
}
相关推荐
sysin.org2 小时前
VMware ESXi 7.0U3q macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025
windows·macos·esxi·bios·oem·网卡驱动·nvme驱动
shuxianshrng2 小时前
大气网格化精细化监管监测系统
大数据·服务器·windows·经验分享
晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑2 小时前
苍穹外卖学习笔记(七)
java·windows·笔记·学习·mybatis
偷偷小野猪5 小时前
想要自动删除浏览器历史记录吗?这样设置就对了
windows·edge浏览器
充值内卷9 小时前
WPF入门教学四 WPF控件概述
windows·ui·wpf
程序猿小D1 天前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa
iummature1 天前
ZLMediaKit Windows编译以及使用
windows
周伯通*1 天前
Windows上,使用远程桌面连接Ubuntu
linux·windows·ubuntu
GDAL1 天前
GNU力量注入Windows:打造高效跨平台开发新纪元
服务器·windows·gnu
小徐敲java1 天前
Windows本地制作java证书(与jeecgboot配置本地证书ssl问题)
java·windows·ssl