JBPM流程部署之流程实例迁移

JBPM流程实例迁移
本文介绍JBPM中流程实例迁移的方法,包括默认迁移行为、指定版本迁移、节点映射及自定义迁移策略等内容。

JBPM流程部署之流程实例迁移

 

       前面我们已经学习了JBPM的流程版本升级,流程版本升级给我们带来了一个新的问题,那就是流程实例迁移;那么什么是流程实例的迁移呢?流程实例的迁移就是在流程发布的时候进行了版本升级,这个时候如果我们让已经运行的同一个流程的实例,按照新版本的流程定义来流转。流程实例的迁移是一件比较复杂的事情,今天我们就简单的来了解一下JBPM中流程实例迁移的使用,后续我们就简单的介绍一下相应的设计思路和扩展。

      默认情况下,JBPM为我们提供了两种启动流程实例的方式     

ProcessInstance processInstance  =  executionService.startProcessInstanceByKey( " AsyncFork " );

      这种方式会根据流程的pdkey来查找该流程的最新版本进行启动,这样可以保证在我们在任何时候启动的都是当前流程的最新版本

ProcessInstance processInstance  =  executionService.startProcessInstanceById( " AsyncFork-1 " );

      这种方式是根据流程的pdid来启动给定版本的流程,这样可以我们可以启动该流程的任何版本

      如果您对流程定义的属性pdkey和pdid不是很清楚,请阅读我先前的文章JBPM流程部署之流程版本升级

      虽然JBPM为我们提供了启动流程实例的两个方法,是我们可以方便的启动最新版本、任意版本的流程,但是默认情况下,已经启动的流程实例在整个生命周期内,都会一直使用同一个版本的流程定义,即使有新的版本发布,也不会使用新的版本。但是现实中,有很多的时候我们需要定制流程实例是否迁移。今天我们就结合下边的这个流程定义来看一下JBPM为我们提供的流程实例迁移的工具怎么用!   

< process  name ="foobar" >
  
< 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如下   

< process  name ="foobar" >
  
< 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 >

     结束先前版本的流程实例的运行
     无论流程定义怎么变化,我们都可以结束先前版本的流程实例运行

< process  name ="foobar" >
  ...
  
< migrate-instances  action ="end" />
</ process >

     指定处于一个区间的版本的流程实例进行迁移或者结束    

     只迁移版本为2和3的流程定义的流程实例

< process  name ="foobar" >
  
< 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" />
  <!--默认是流程实例进行迁移,所以action="migrate"可以省略-->
  
< migrate-instances   versions ="2..3" />
</ process >
 

      只迁结束版本为2和3的流程定义的流程实例

< process  name ="foobar" >
  
< 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 >

      只迁移最后两个版本的流程实例

< process  name ="foobar" >
  ...
  
< migrate-instances  versions ="x-2..x" />
</ process >

      迁移所有版本的流程实例

     

< process  name ="foobar" >
  ...
  
< migrate-instances  versions ="1..x" />
</ process >

 

< process  name ="foobar" >
  ...
  
< migrate-instances  versions ="*" />
</ process >

    节点映射迁移
    如果流程有的节点被删除或者被替换,先前版本的流程的实例如果正好运行到删除的节点,那么我们就不能直接将其迁移,如果我们不能迁移,那么我们需要提供节点映射

< process  name ="foobar" >
  
< 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,在这里实现我们自己的迁移策略

< process  name ="foobar" >
  ...
  
< migrate-instances >
    
< migration-handler  class ="org.jbpm.test.migration.TestHandler" />
  
</ migrate-instances >
</ process >

 


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值