Flowable里那些流程怎么部署又该怎么删,弄明白了才不会乱七八糟
- 问答
- 2026-01-13 02:37:52
- 3
Flowable这个工作流引擎,核心就是管理流程的生命周期,流程定义就像一张建筑图纸,而流程实例就是根据这张图纸盖起来的一栋栋具体的楼房,部署就是把图纸存入档案馆,启动就是开始盖楼,如果图纸过时了或者有问题,我们就需要处理它,这就是部署和删除要解决的问题,如果不把这些操作弄明白,你的系统里就会堆满各种版本的图纸和一堆没人管的烂尾楼,时间一长,系统就会变得乱七八糟,难以维护。
流程怎么部署:把图纸放进档案馆
部署,说白了就是把你的流程定义文件(通常是BPMN 2.0标准的XML文件)交给Flowable引擎,引擎会解析它,并把相关信息存到自己的数据库里,这样,以后就可以根据这个部署好的“图纸”来启动流程了。
根据Flowable官方文档,部署方式主要有以下几种,你可以根据实际情况选择:
-
通过API编程部署:这是最常用、最灵活的方式,你在Java代码里,使用Flowable提供的
RepositoryService来实现。- 单个文件部署:如果你只有一个BPMN XML文件,可以用
repositoryService.createDeployment().addClasspathResource("你的流程文件.bpmn20.xml").deploy();,这行代码的意思是从项目的类路径下找到那个XML文件,然后部署它。 - 压缩包部署:如果你有一整套流程相关的文件(比如一个BPMN文件加上一些表单文件、业务规则文件等),可以先把它们打成一个ZIP压缩包,然后用
repositoryService.createDeployment().addZipInputStream(new ZipInputStream(你的ZIP文件输入流)).deploy();,这种方式便于批量管理和迁移。
- 单个文件部署:如果你只有一个BPMN XML文件,可以用
-
通过Flowable UI应用部署:如果你安装了Flowable提供的独立UI应用(如Flowable Modeler, Flowable Task等),有一个图形化的管理界面,你可以直接在这个界面上,像上传文件一样,把你的BPMN文件或者ZIP包拖拽上去进行部署,这种方式非常直观,适合测试阶段或者运维人员操作。

-
自动部署(适用于Spring Boot):在Spring Boot项目里,Flowable提供了极简的配置,你只需要把BPMN文件放在
src/main/resources/processes/这个目录下,当Spring Boot应用启动时,Flowable会自动扫描这个目录,并部署找到的所有BPMN文件,这非常方便,但要注意控制,避免在正式环境因为重启服务就误部署了未测试的流程。
部署成功后,你可以在Flowable的数据表里(主要是ACT_RE_DEPLOYMENT部署信息表和ACT_RE_PROCDEF流程定义表)看到新的记录,每一次部署都会产生一条唯一的部署ID。
流程怎么删除:清理过时的图纸和烂尾楼
删除操作比部署要复杂一点,因为你不仅要考虑“图纸”(流程定义),还要考虑根据这张图纸已经盖起来的“楼房”(流程实例),直接乱删会导致数据不一致,根据Flowable的设计,删除的核心单位是“部署”。

-
删除一个部署(核心方法): 同样使用
RepositoryService,关键的方法是repositoryService.deleteDeployment("部署ID")。 这里有一个非常重要的参数叫cascade(级联),你需要根据是否有流程实例在运行来决定怎么用:- 该部署下的流程实例一个都没启动过。 这时候你可以安全地直接删除:
repositoryService.deleteDeployment("deploymentId"),这只会删除部署信息和流程定义本身。 - 该部署下已经有流程实例启动了(哪怕只有一个)。 如果你还用上面的方法,Flowable会抛出一个异常,阻止你删除,这是一种保护机制,因为强行删除会导致流程实例找不到它的“图纸”,变成“孤儿实例”。
这时候,你必须使用级联删除:
repositoryService.deleteDeployment("deploymentId", true),这个true就是告诉引擎:“我不仅要删掉这张图纸,还要把根据这张图纸盖起来的所有楼房(流程实例),不管它盖到哪一步了,连同它们的历史记录,统统给我拆掉!” 这是一个非常危险的操作,因为它会永久性地删除所有相关数据。在生产环境中使用级联删除一定要极其谨慎。
- 该部署下的流程实例一个都没启动过。 这时候你可以安全地直接删除:
-
挂起与激活:另一种“软删除”: 很多时候,我们并不是真想永久删除一个流程,只是因为它有bug或者版本过时了,不想让用户再启动新的实例,这时候,直接删除不是最佳选择,特别是当还有老实例在运行时,更优雅的方式是“挂起”这个流程定义。
- 挂起:
repositoryService.suspendProcessDefinitionById("流程定义ID"),执行后,这个流程定义就不能再启动新的流程实例了,已经存在的、正在运行的实例会继续执行完毕,这就像告诉工地:“这张图纸作废了,别再盖新楼了,但已经开工的楼继续盖完。” - 激活:如果之后想重新启用这个流程,可以再用
repositoryService.activateProcessDefinitionById("流程定义ID")把它激活。
- 挂起:
如何避免“乱七八糟”:一些实践经验
明白了怎么部署和删除,更重要的是知道什么时候该用什么方法。
- 开发测试阶段:可以随意部署和级联删除,方便快速迭代,使用Spring Boot的自动部署或API部署都很方便。
- 预发布/生产环境:
- 部署要规范:部署要有版本概念,比如在BPMN文件名称或部署时带上版本号(
my-process-v1.2.bpmn20.xml),这样在数据库里就能清晰地区分不同版本。 - 慎用删除:对于旧版本的部署,只要没有运行中的实例,可以直接删除,但如果还有实例在运行,首选是将其挂起,而不是删除,等到所有关联的实例都运行完毕,历史数据也已经备份或无需保留后,再计划删除它。
- 清理策略:可以定期审查部署表,清理那些确实不再需要的、也没有任何历史关联的陈旧部署,但对于有历史价值的流程部署,即使挂起了,也建议保留,因为历史流程实例数据会关联到它的部署ID和流程定义ID,删除后查看历史会不完整。
- 部署要规范:部署要有版本概念,比如在BPMN文件名称或部署时带上版本号(
核心思想就是:部署是增加,删除是清理,清理时,一定要看清楚有没有“活着的”流程实例,有实例就跑着的,要么用级联删除“连锅端”(慎用),要么先“挂起”让它自然死亡后再清理。 把这套逻辑理顺了,你的Flowable流程库就能保持清晰有序,而不是一团乱麻。
本文由钊智敏于2026-01-13发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/79668.html
