# 业务流程编排框架 **Repository Path**: ycliud2016/ruyuan-process-engine ## Basic Information - **Project Name**: 业务流程编排框架 - **Description**: 业务流程编排框架11 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-01-17 - **Last Updated**: 2025-09-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 儒猿流程引擎 ### 基本概念 流程引擎本质上是一个基于责任链模式拓展的组件,在责任链基础上增加了一些功能。 在流程引擎中,一个流程由多个流程节点组成,流程节点之间的顺序关系可以通过配置文件来定义,支持动态配置流程节点顺序。 通过流程引擎,可以将系统一些业务逻辑拆分为一个一个节点,然后可以对这些节点进行自由组合,动态切换节点顺序,可以快速适应多变的业务发展。 目前定义了3种类型的流程节点,分别如下: - 标准流程节点:一个普通的Action - 可回滚流程节点:当后续节点出现异常的时候,会执行可回滚操作的Action - 动态流程节点:在程序运行的时候根据状态动态选择下一个节点的Action ### 快速启动 Maven引用 ``` com.ruyuan process-engine-wrapper 0.0.7 ``` #### xml方式配置 声明几个节点 标准节点集成StandardProcessor ``` @Component public class StandardProcessorDemo2 extends StandardProcessor { @Override protected void processInternal(ProcessContext context) { System.out.println("StandProcessor " + context.get("id")); } } ``` 可回滚节点继承RollbackProcessor ``` @Component public class RollBackProcessorDemo extends RollbackProcessor { @Override protected void processInternal(ProcessContext context) { System.out.println("RollBackProcessor " + context.get("id")); } @Override protected void rollback(ProcessContext context) { System.out.println("rollback RollBackProcessor " + context.get("id")); } } ``` 动态节点继承DynamicProcessor ``` @Component public class DynamicProcessorDemo extends DynamicProcessor { @Override protected void processInternal(ProcessContext context) { System.out.println("DynamicProcess " + context.get("id")); } @Override protected String nextNodeId(ProcessContext context) { return "node4"; } } ``` 声明xml配置文件: ``` ``` 其中配置文件的意思是,声明了一个process1的流程,其中第一个节点为node1,下一个节点为node2,再下一个节点为node3, node3的下一个节点可能是node4或者node5, 这要根据代码运行判断。上面的代码例子中,node3的下一个节点指定了为id是node4的节点。 运行代码: ``` public static void main(String[] args) throws Exception { ProcessEngine processEngine = new ProcessEngine( new ClassPathXmlProcessParser("process-demo.xml")); ProcessContext process1 = processEngine.getContext("process1"); process1.set("nextId", "node4"); process1.start(); } ``` 其中可以通过ProcessContext.set(key,value)方法在不同的节点中传递信息。 #### 注解方式集成 在启动类加上@EnableProcessEngine("packageName"), value值为扫描节点的包名,接着在每一个节点上面加上注解即可。框架会自动扫描节点,并根据groupId 聚合节点构建成一个流程 ``` @Slf4j @RestController @SpringBootApplication @EnableProcessEngine("process-demo.xml") public class Application { @Autowired private ProcessContextFactory processContextFactory; public static void main(String[] args) { SpringApplication.run(Application.class, args); } @GetMapping("/test1") public String test1() { ProcessContext process1 = processContextFactory.getContext("process1"); process1.set("id", "process1"); process1.start(); return "true"; } } ``` ### 动态刷新流程节点配置 流程引擎的一大优势是可以任意调整流程的顺序,可以配合配置中心实现动态更新流程配置。 以下例子以nacos作为配置中心为例: nacos上面添加配置: ![](img/pic1.png) 接着在应用程序启动的时候加入如下代码,即可重新刷新流程 ``` String serverAddr = "localhost"; String dataId = "xml.demo"; String group = "DEFAULT_GROUP"; Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr); ConfigService configService = NacosFactory.createConfigService(properties); String content = configService.getConfig(dataId, group, 5000); configService.addListener(dataId, group, new AbstractListener() { @Override public void receiveConfigInfo(String configInfo) { StringXmlProcessParser stringXmlProcessParser = new StringXmlProcessParser(configInfo); processContextFactory.refresh(stringXmlProcessParser.parse()); System.out.println("recieve:" + configInfo); } }); ```