flowable 工作流引擎 - 流程实例迁移

flowable 工作流引擎 - 流程实例迁移

场景

我们在进行流程按阶段开发时会遇到一个情况,例如:
一个很长的流程,但是是分段式开发的,A、B、C三个流程是一个流程,但是在开发的时候由于流程太长,时间周期只能先做一部分让客户进行使用,所以将流程拆成三段式开发,那么在我们开发完A流程的时候在A流程的基础上追加B流程,这个时候A流程已经在线上运行了一段时间了,也有很多的数据了,那么在B流程开发完成以后需要把A流程上的数据都迁移至A、B流程迭代的版本上来。

A流程
在这里插入图片描述
A、B迭代版本
在这里插入图片描述

解决方案

在flowable 6.5以后提供了一个Api服务类ProcessMigrationService,可通过他来进行流程实例的迁移工作。
通过 processMigrationService 可以使用如下的 API:

public ProcessInstanceMigrationBuilder createProcessInstanceMigrationBuilder() {
        return new ProcessInstanceMigrationBuilderImpl(this);
    }

    public ProcessInstanceMigrationBuilder createProcessInstanceMigrationBuilderFromProcessInstanceMigrationDocument(ProcessInstanceMigrationDocument document) {
        return this.createProcessInstanceMigrationBuilder().fromProcessInstanceMigrationDocument(document);
    }

    public ProcessInstanceMigrationValidationResult validateMigrationForProcessInstance(String processInstanceId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
        return (ProcessInstanceMigrationValidationResult)this.commandExecutor.execute(new ProcessInstanceMigrationValidationCmd(processInstanceId, processInstanceMigrationDocument));
    }

    public ProcessInstanceMigrationValidationResult validateMigrationForProcessInstancesOfProcessDefinition(String processDefinitionId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
        return (ProcessInstanceMigrationValidationResult)this.commandExecutor.execute(new ProcessInstanceMigrationValidationCmd(processInstanceMigrationDocument, processDefinitionId));
    }

    public ProcessInstanceMigrationValidationResult validateMigrationForProcessInstancesOfProcessDefinition(String processDefinitionKey, int processDefinitionVersion, String processDefinitionTenantId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
        return (ProcessInstanceMigrationValidationResult)this.commandExecutor.execute(new ProcessInstanceMigrationValidationCmd(processDefinitionKey, processDefinitionVersion, processDefinitionTenantId, processInstanceMigrationDocument));
    }

    public void migrateProcessInstance(String processInstanceId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
        this.commandExecutor.execute(new ProcessInstanceMigrationCmd(processInstanceId, processInstanceMigrationDocument));
    }

    public void migrateProcessInstancesOfProcessDefinition(String processDefinitionId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
        this.commandExecutor.execute(new ProcessInstanceMigrationCmd(processInstanceMigrationDocument, processDefinitionId));
    }

    public void migrateProcessInstancesOfProcessDefinition(String processDefinitionKey, int processDefinitionVersion, String processDefinitionTenantId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
        this.commandExecutor.execute(new ProcessInstanceMigrationCmd(processDefinitionKey, processDefinitionVersion, processDefinitionTenantId, processInstanceMigrationDocument));
    }

    public Batch batchMigrateProcessInstancesOfProcessDefinition(String processDefinitionId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
        return (Batch)this.commandExecutor.execute(new ProcessInstanceMigrationBatchCmd(processDefinitionId, processInstanceMigrationDocument));
    }

    public Batch batchMigrateProcessInstancesOfProcessDefinition(String processDefinitionKey, int processDefinitionVersion, String processDefinitionTenantId, ProcessInstanceMigrationDocument processInstanceMigrationDocument) {
        return (Batch)this.commandExecutor.execute(new ProcessInstanceMigrationBatchCmd(processDefinitionKey, processDefinitionVersion, processDefinitionTenantId, processInstanceMigrationDocument));
    }

    public ProcessInstanceBatchMigrationResult getResultsOfBatchProcessInstanceMigration(String migrationBatchId) {
        return (ProcessInstanceBatchMigrationResult)this.commandExecutor.execute(new GetProcessInstanceMigrationBatchResultCmd(migrationBatchId));
    }

使用迁移的方法

首先我们需要使用他提供的迁移验证方法,加一道保险,毕竟该流程对线上数据存在影响

 // 迁移验证
        boolean migrationValid = processMigrationService.createProcessInstanceMigrationBuilder()
                .migrateToProcessDefinition(toProcessDefId) // 原流程id
                .validateMigrationOfProcessInstances(fromProcessDefId) //需要迁移到的流程id
                .isMigrationValid();

如果 migrationValid 等于false说明flowable自带的验证没通过,就可以自行做一些业务处理。

如果验证通过,就可以调用执行迁移的方法:

	// 验证通过执行迁移
        processMigrationService.createProcessInstanceMigrationBuilder()
                .migrateToProcessDefinition(toProcessDefId)
                .migrateProcessInstances(fromProcessDefId);

完整代码:

public void procInstMigration(String fromProcessDefId, String toProcessDefId) throws Exception {
        // 迁移验证
        boolean migrationValid = processMigrationService.createProcessInstanceMigrationBuilder()
                .migrateToProcessDefinition(toProcessDefId)
                .validateMigrationOfProcessInstances(fromProcessDefId)
                .isMigrationValid();
        if (!migrationValid) {
            // 验证不通过
            throw new Exception("流程定义差异过大不满足在途流程的迁移,请修改流程图");
        }
        // 验证通过执行迁移
        processMigrationService.createProcessInstanceMigrationBuilder()
                .migrateToProcessDefinition(toProcessDefId)
                .migrateProcessInstances(fromProcessDefId);
    }

注意:旧版流程已经结束,该方法不会处理

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本课程是《Flowable流程入门课程》的后续高级课程。在学习本课程前,应先学习入门课程,以掌握相关基础知识。高级课程着重讲解Flowable工作的高级概念、复杂理论和实战应用。课程内容包括流程管理思想、技术与标准、工作的控制模式和资源模式;Flowable数据库表及变量;与Spring、Spring Boot的集成;BPMN 2.0主要类图;Flowable高级服务如JAVA服务任务、脚本任务、Web Service任务、外部工作者任务、多实例任务、补偿处理程序、子流程和调用活动等;Flowable事件侦听器、执行侦听器和任务侦听器;Flowable历史和REST API;Flowable事务、并发性、身份管理及LDAP集成;Flowable高级主题如流程实例迁移、异步执行器的设计与配置、用于高并发的UUID ID生成器、多租户、高级流程引擎配置、执行自定义SQL和实验性流程调试器等;Flowable Eclipse设计器特性及定制;Flowable 事件注册;Flowable相关标准和规范如ISO8601标准和cron等。本课程对Flowable官方文档进行了彻底梳理和融汇贯通,并结合实践,形象生动、系统全面、简单易懂地呈现给大家,让大家从开源软件文档冗长耗时、英文晦涩难懂、概念理解困难、知识点分散等困境中解脱出来,从而能快速地将Flowable具有的高级特性应用到项目的高级需求和复杂实践中去。课程特色:案例和代码驱动、基础概念与经典实战相结合、知识环节融会贯通、关联知识平滑拓展、概念和原理展示形象生动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿泽java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值