{"id":49538531,"url":"https://github.com/sizzlecar/mundo","last_synced_at":"2026-05-02T13:05:21.088Z","repository":{"id":43356024,"uuid":"422597411","full_name":"sizzlecar/mundo","owner":"sizzlecar","description":"mundo是一个轻量级，灵活的，高性能的流程引擎","archived":false,"fork":false,"pushed_at":"2025-03-31T14:39:10.000Z","size":292,"stargazers_count":16,"open_issues_count":3,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-07T10:06:49.191Z","etag":null,"topics":["java","processengine"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sizzlecar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-10-29T14:04:07.000Z","updated_at":"2025-04-09T10:19:38.000Z","dependencies_parsed_at":"2024-03-04T19:11:55.811Z","dependency_job_id":null,"html_url":"https://github.com/sizzlecar/mundo","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/sizzlecar/mundo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sizzlecar%2Fmundo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sizzlecar%2Fmundo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sizzlecar%2Fmundo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sizzlecar%2Fmundo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sizzlecar","download_url":"https://codeload.github.com/sizzlecar/mundo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sizzlecar%2Fmundo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32534975,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-02T12:25:33.646Z","status":"ssl_error","status_checked_at":"2026-05-02T12:24:51.733Z","response_time":132,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","processengine"],"created_at":"2026-05-02T13:05:13.200Z","updated_at":"2026-05-02T13:05:21.080Z","avatar_url":"https://github.com/sizzlecar.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mundo - 轻量级，可扩展的流程引擎\n\n![License](https://img.shields.io/github/license/sizzlecar/mundo)\n![GitHub stars](https://img.shields.io/github/stars/sizzlecar/mundo)\n![Codecov branch](https://img.shields.io/codecov/c/github/sizzlecar/mundo/master)\n\n## mundo是什么？\n\nmundo是一个轻量级，可扩展的流程引擎。\n\n## mundo可以做什么？\n\n我们工作生活中有各种各样的流程，比如公司的请假流程，银行的贷款流程，特定的业务流程。\n1. 需要根据业务条件动态跳过某些流程中的节点\n2. 同一个流程有不同的版本，同时存在\n3. 涉及到复杂的串行与并行同时存在的流程\n4. 需要对流程进行热加载(规划中)\n\n以上涉及到的流程场景，全都可以交给mundo管理\n\n## 快速开始\n\n1. 添加mundo依赖\n\n```xml\n\u003cdependencys\u003e\n    \u003c!--非spring环境--\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003ecom.bluslee\u003c/groupId\u003e\n        \u003cartifactId\u003emundo-process\u003c/artifactId\u003e\n        \u003cversion\u003e0.0.1\u003c/version\u003e\n    \u003c/dependency\u003e\n\n    \u003c!--springboot--\u003e\n    \u003cdependency\u003e\n        \u003cgroupId\u003ecom.bluslee\u003c/groupId\u003e\n        \u003cartifactId\u003espring-boot-starter-mundo\u003c/artifactId\u003e\n        \u003cversion\u003e0.0.1\u003c/version\u003e\n    \u003c/dependency\u003e\n\u003c/dependencys\u003e\n```\n\n2. 定义流程\n\nmundo目前支持XML定义流程,XML中允许出现的标签见下面的表格\n\n|  标签   | 描述  | 属性  |  属性描述  |\n|  ----  | ----  |  ----  | ----  |\n|  mundo | XML配置文件的根标签，一个XML文件有且只能有一个 |   |    |\n| process  | 流程标签，一个process标签就对应一个业务流程定义，一个mundo标签下，可以有多个process标签| id  |  流程的id与version构成流程的唯一键，一个XML文件内 process的id与version不能重复，否则会被覆盖 |\n|   | | name  |  流程的名称 |\n|   | | version  |  流程的版本号， 流程的id与version构成流程的唯一键，一个XML文件内 process标签的id与version不能重复，否则会被覆盖|\n|  start | 开始标签，代表流程的开始 | id  | 标签的唯一标识，一个process标签内不能出现id重复的标签，一个process标签下可以出现多个 |\n|   |  | name  | 标签的名称 |\n|  activity | 活动标签，代表流程中活动，比如某人的审批，某人的修改等 | id  | 标签的唯一标识，一个process标签内不能出现id重复的标签，一个process标签下可以出现多个 |\n|   |  | name  | 标签的名称 |\n|  exclusiveGateway | 排他网关标签，代表流程下一步出现分支，根据条件只会进入其中一个分支 | id  | 标签的唯一标识，一个process标签内不能出现id重复的标签，一个process标签下可以出现多个 |\n|   |  | name  | 标签的名称 |\n|  parallelGateway | 并行网关标签，代表流程下一步出现分支，流程可以同时到达下一步的多个分子 | id  | 标签的唯一标识，一个process标签内不能出现id重复的标签，一个process标签下可以出现多个 |\n|   |  | name  | 标签的名称 |\n|  link | link标签，代表流程中各个节点的流向，流程中的每个节点都至少有一条link | id  | 标签的唯一标识，一个process标签内不能出现id重复的标签，一个process标签下可以出现多个 |\n|   |  | name  | 标签的名称 |\n|   |  | sourceId  | link的出发节点id |\n|   |  | targetId  | link的目的节点id |\n|  conditionExpression | 表达式标签，代表由出发节点到目的节点需要满足的条件，使用OGNL解析表达式 |   |  |\n|  end | 结束标签，代表流程的终点 | id  | 标签的唯一标识，一个process标签内不能出现id重复的标签，一个process标签下可以出现多个 |\n|   |  | name  | 标签的名称 |\n\n如下是一个简单的完整的XML配置文件\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cmundo xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://bluslee.com/POM/1.0.0\" xsi:schemaLocation=\"http://bluslee.com/POM/1.0.0 http://bluslee.com/xsd/mundo-1.0.0.xsd\"\u003e\n    \u003cprocess id=\"process-001\" name=\"简单流程\" version=\"0\"\u003e\n        \u003cstart id=\"START\" name=\"开始\"/\u003e\n        \u003cactivity id=\"SUP_CREATE\" name=\"供应商创建单据\"/\u003e\n        \u003cactivity id=\"BUYER_APPROVE\" name=\"采购审批单据\"/\u003e\n        \u003cactivity id=\"SUP_UPDATE\" name=\"供应商修改单据\"/\u003e\n        \u003cexclusiveGateway id=\"BUYER-APPROVE-GATEWAY\" name=\"采购审批\"/\u003e\n        \u003clink id=\"START_SUP_CREATE\" name=\"START_SUP_CREATE\" sourceId=\"START\" targetId=\"SUP_CREATE\"/\u003e\n        \u003clink id=\"SUP_CREATE_BUYER_APPROVE\" name=\"SUP_CREATE_BUYER_APPROVE\" sourceId=\"SUP_CREATE\" targetId=\"BUYER_APPROVE\"/\u003e\n        \u003clink id=\"BUYER_APPROVE_BUYER-APPROVE-GATEWAY\" name=\"BUYER_APPROVE_BUYER-APPROVE-GATEWAY\" sourceId=\"BUYER_APPROVE\" targetId=\"buyer-approve-gateway\"/\u003e\n        \u003clink id=\"BUYER-APPROVE-GATEWAY_SUP_UPDATE\" name=\"BUYER-APPROVE-GATEWAY_SUP_UPDATE\" sourceId=\"BUYER-APPROVE-GATEWAY\" targetId=\"SUP_UPDATE\"\u003e\n            \u003cconditionExpression\u003e#approve == false\u003c/conditionExpression\u003e\n        \u003c/link\u003e\n        \u003clink id=\"SUP_UPDATE_BUYER_APPROVE\" name=\"SUP_UPDATE_BUYER-APPROVE-GATEWAY\" sourceId=\"SUP_UPDATE\" targetId=\"BUYER_APPROVE\"/\u003e\n        \u003clink id=\"BUYER-APPROVE-GATEWAY_END\" name=\"BUYER-APPROVE-GATEWAY_END\" sourceId=\"BUYER-APPROVE-GATEWAY\" targetId=\"end\"\u003e\n            \u003cconditionExpression\u003e#approve == true\u003c/conditionExpression\u003e\n        \u003c/link\u003e\n        \u003cend id=\"end\" name=\"审批结束\"/\u003e\n    \u003c/process\u003e\n\u003c/mundo\u003e\n```   \n\n3. 示例代码\n\n- 非spring环境\n```java\npackage com.bluslee.mundo.process.test;\n\nimport com.bluslee.mundo.core.configuration.RepositoryBuilder;\nimport com.bluslee.mundo.core.process.base.BaseProcessNode;\nimport com.bluslee.mundo.core.process.base.Repository;\nimport com.bluslee.mundo.process.DefaultBootstrap;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport java.util.HashMap;\n\n/**\n * BaseBootstrapTest.\n * @author carl.che\n * @date 2021/11/9\n */\npublic class BaseBootstrapTest {\n    \n    @Test\n    public void bootstrapTest() {\n        //1. 设置配置文件的路径，属性名必须是mundo.xml-path\n        Configuration configuration = new XmlConfiguration();\n        configuration.setProperty(XmlConstants.ConfigKey.XML_PATH_CONFIG_NAME, \"/mundo.cfg.xml\");\n        //2. 用Bootstrap的示例，传入配置构建Repository，调用build方法，这个时候配置器会根据配置解析XML，验证，加载定义的流程，返回 XML定义的流程的集合，即Repository\n        Repository\u003cBaseProcessNode\u003e repository = Bootstrap.getInstance().build(configuration);\n        //3. 从Repository查找流程,可以获取全部流程，也可以根据id,version进行查询，如果不传version默认返回最新版本的流程\n        ProcessEngine\u003cBaseProcessNode\u003e processEngine001 = repository.getProcess(\"process-001\");\n        //4. 调用流程流程接口\n        //4.1 获取当前流程id\n        processEngine001.getId();\n        //4.2 获取当前引擎版本号.\n        processEngine001.getVersion();\n        //4.3 根据id在当前流程中寻找对应的node\n        BaseProcessNode node001 = processEngine001.getProcessNode(\"node-001\");\n        //4.4 根据当前节点，以及参数找出下一个节点.\n        Map\u003cString, Object\u003e paraMap = new HashMap\u003c\u003e();\n        //XML中表达式中出现的参数，使用OGNL解析\n        paraMap.put(\"#approve\", true);\n        //4.5 获取下一个节点\n        ProcessNodeWrap\u003cBaseProcessNode\u003e nextProcessNodeWrap = processEngine001.getNextProcessNode(node001, paraMap);\n        if (nextProcessNodeWrap.parallel()) {\n            //下一个节点是并行行节可能返回多个节点\n            Set\u003cBaseProcessNode\u003e parallelNodes = nextProcessNodeWrap.getParallelNodes();\n        }else {\n            //非并行节点\n            BaseProcessNode nextNode = nextProcessNodeWrap.get();\n        }\n    }\n}\n```\n\n- springboot\n\n```yaml\nmundo:\n  enabled: true\n  xml:\n    xml-path: /mundo.cfg.xml\n```\n\n```java\npackage com.bluslee.mundo.springboot.starter.test;\n\nimport com.bluslee.mundo.core.process.base.BaseProcessNode;\nimport com.bluslee.mundo.core.process.base.Repository;\nimport com.bluslee.mundo.xml.XmlSchema;\nimport org.junit.Assert;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Map;\nimport java.util.stream.Collectors;\n\n/**\n * MundoStarterTest.\n */\n@RunWith(SpringJUnit4ClassRunner.class)\n@SpringBootTest(classes = MundoStarterTest.class)\n@SpringBootApplication\npublic class MundoStarterTest {\n\n    @Autowired\n    private Repository\u003c? extends BaseProcessNode\u003e repository;\n\n    @Test\n    public void test() {\n        ProcessEngine\u003cBaseProcessNode\u003e processEngine001 = repository.getProcess(\"process-001\");\n        //1. 调用流程流程接口\n        //1.1 获取当前流程id\n        processEngine001.getId();\n        //1.2 获取当前引擎版本号.\n        processEngine001.getVersion();\n        //1.3 根据id在当前流程中寻找对应的node\n        BaseProcessNode node001 = processEngine001.getProcessNode(\"node-001\");\n        //1.4 根据当前节点，以及参数找出下一个节点.\n        Map\u003cString, Object\u003e paraMap = new HashMap\u003c\u003e();\n        //XML中表达式中出现的参数，使用OGNL解析\n        paraMap.put(\"#approve\", true);\n        //1.5 获取下一个节点\n        ProcessNodeWrap\u003cBaseProcessNode\u003e nextProcessNodeWrap = processEngine001.getNextProcessNode(node001, paraMap);\n        if (nextProcessNodeWrap.parallel()) {\n            //下一个节点是并行行节可能返回多个节点\n            Set\u003cBaseProcessNode\u003e parallelNodes = nextProcessNodeWrap.getParallelNodes();\n        }else {\n            //非并行节点\n            BaseProcessNode nextNode = nextProcessNodeWrap.get();\n        }\n    }\n}\n\n```\n\n## 为什么要选择mundo\n\n目前市面上主流的流程引擎有Flowable，Activiti等，以Flowable为例，Flowable是一个基于BPMN规范，功能强大的框架， Flowable流程引擎可用于\n部署BPMN 2.0流程定义（用于定义流程的行业XML标准），创建这些流程定义的流程实例，进行查询，访问运行中或历史的流程实例与相关数据，除此之外\n还提供权限，表单，UI，流程版本管理，热部署，统计等功能。Flowable尽可能的提供了你所有可能需要的东西，这带来的并不全是好处，比如过高的学习成本\nFlowable的核心是BPMN规范，这个规范本身就很复杂，BPMN2.0完整的介绍是一份500多页的PDF，BPMN规范中的概念对于常见的流程中可能根本用不到，\nmundo关于流程的定义参考了BPMN规范，但尽可能的保持简单。Flowable是一个完整的应用，它需要自己的DB，因为它保存了所有有关流程的数据，包括运行时，\n当你的业务中启动一个流程示例时，flowable对应也会有一个一对一的实例，这个流程的历史，表单数据，flowable都会保存，这样有些时候会帮你减少很多工作，\n但是有些时候也会限制你的灵活性，你需要flowable提供的数据适配成自己业务需要的。mundo的设计原则是保持简单，职责单一，mundo核心的api只有2个，\nmundo的思路与Flowable也有所不同，不论业务有多少个流程实例，mundo中一个流程定义只有一个流程实例，业务中流程实例只需要保存当前实例处于流程的位置\n当流程节点需要进行下一步时，业务侧提供当前节点，业务参数，mundo根据流程的定义计算出下一步返回给业务侧。总结一下flowable是一个大的全的应用，而mundo\n是一个简单高效的流程引擎组件。\n\n## 项目地址\n\n[GitHub](https://github.com/sizzlecar/mundo)\n[gitee](https://gitee.com/sizzle_carl/mundo)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsizzlecar%2Fmundo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsizzlecar%2Fmundo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsizzlecar%2Fmundo/lists"}