JBPM流程部署之流程实例迁移
JBPM流程部署之流程实例迁移
前面我们已经学习了JBPM的流程版本升级,流程版本升级给我们带来了一个新的问题,那就是流程实例迁移;那么什么是流程实例的迁移呢?流程实例的迁移就是在流程发布的时候进行了版本升级,这个时候如果我们让已经运行的同一个流程的实例,按照新版本的流程定义来流转。流程实例的迁移是一件比较复杂的事情,今天我们就简单的来了解一下JBPM中流程实例迁移的使用,后续我们就简单的介绍一下相应的设计思路和扩展。
默认情况下,JBPM为我们提供了两种启动流程实例的方式
这种方式会根据流程的pdkey来查找该流程的最新版本进行启动,这样可以保证在我们在任何时候启动的都是当前流程的最新版本
这种方式是根据流程的pdid来启动给定版本的流程,这样可以我们可以启动该流程的任何版本
如果您对流程定义的属性pdkey和pdid不是很清楚,请阅读我先前的文章JBPM流程部署之流程版本升级
虽然JBPM为我们提供了启动流程实例的两个方法,是我们可以方便的启动最新版本、任意版本的流程,但是默认情况下,已经启动的流程实例在整个生命周期内,都会一直使用同一个版本的流程定义,即使有新的版本发布,也不会使用新的版本。但是现实中,有很多的时候我们需要定制流程实例是否迁移。今天我们就结合下边的这个流程定义来看一下JBPM为我们提供的流程实例迁移的工具怎么用!
<start>
<transition to="a"/>
</start>
<state name="a">
<transition to="b">
</state>
<state name="b">
<transition to="c"/>
</state>
<state name="c">
<transition to="end"/>
</state>
<end name="end"/>
</process>
升级先前的版本的所有流程实例
在以下两种情况下,我们可以升级先前所有版本的流程实例而不会引发异常
1. 保证流程定义整体结构不变和所有节点的名称不变;
2. 保证先前版本的流程定义不变,只是新增了节点;
这个时候我们的流程定义xml如下
<start>
<transition to="a"/>
</start>
<state name="a">
<transition to="b">
</state>
<state name="b">
<transition to="c"/>
</state>
<state name="c">
<transition to="end"/>
</state>
<end name="end"/>
<migrate-instances/>
</process>
结束先前版本的流程实例的运行
无论流程定义怎么变化,我们都可以结束先前版本的流程实例运行
...
<migrate-instances action="end"/>
</process>
指定处于一个区间的版本的流程实例进行迁移或者结束
只迁移版本为2和3的流程定义的流程实例
<start>
<transition to="a"/>
</start>
<state name="a">
<transition to="b">
</state>
<state name="b">
<transition to="c"/>
</state>
<state name="c">
<transition to="end"/>
</state>
<end name="end"/>
<migrate-instances versions="2..3"/>
</process>
只迁结束版本为2和3的流程定义的流程实例
<start>
<transition to="a"/>
</start>
<state name="a">
<transition to="b">
</state>
<state name="b">
<transition to="c"/>
</state>
<state name="c">
<transition to="end"/>
</state>
<end name="end"/>
<migrate-instances action="end" versions="2..3"/>
</process>
只迁移最后两个版本的流程实例
...
<migrate-instances versions="x-2..x"/>
</process>
迁移所有版本的流程实例
...
<migrate-instances versions="1..x"/>
</process>
...
<migrate-instances versions="*"/>
</process>
节点映射迁移
如果流程有的节点被删除或者被替换,先前版本的流程的实例如果正好运行到删除的节点,那么我们就不能直接将其迁移,如果我们不能迁移,那么我们需要提供节点映射
<start>
<transition to="a"/>
</start>
<state name="a">
<transition to="c">
</state>
<state name="c">
<transition to="d"/>
</state>
<state name="d">
<transition to="end"/>
</state>
<end name="end"/>
<migrate-instances>
<activity-mapping old-name="b" new-name="c"/>
</migrate-instances>
</process>
自定义迁移策略
如果JBPM提供的流程实例迁移策略不能满足我们的业务需求,那么我们可以实现JBPM提供的接口org.jbpm.pvm.internal.migration.MigrationHandler,在这里实现我们自己的迁移策略
...
<migrate-instances>
<migration-handler class="org.jbpm.test.migration.TestHandler"/>
</migrate-instances>
</process>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现