Skip to content

createDeployment

Flowable 7.1.0 摘要:创建新的流程定义部署构建器。

方法签名与说明

DeploymentBuilder createDeployment()

创建一个新的部署构建器,用于将流程定义、表单、决策表等资源部署到 Flowable 引擎中。部署是 Flowable 中管理流程定义版本的核心机制。

Returns:

  • DeploymentBuilder - 部署构建器实例,用于配置和执行部署操作

常见使用场景

1. 请假审批流程部署

在企业OA系统中,需要部署请假审批流程定义。当HR部门设计好新的请假流程后,通过此API将BPMN文件部署到生产环境。

2. 采购审批流程版本更新

采购部门优化了采购审批流程,增加了金额分级审批逻辑。需要部署新版本的流程定义,同时保持旧版本流程实例继续运行。

3. 多租户环境流程部署

在SaaS平台中,为不同租户(企业客户)部署各自定制的业务流程,需要指定租户ID进行隔离部署。

4. 批量资源部署

部署一个完整的业务模块,包括流程定义BPMN、表单定义、决策表DMN等多个关联资源文件。

Kotlin + Spring Boot 调用示例

示例1:部署单个BPMN流程(请假审批)

kotlin
import org.flowable.engine.RepositoryService
import org.springframework.stereotype.Service
import org.springframework.web.multipart.MultipartFile

@Service
class LeaveProcessDeploymentService(
    private val repositoryService: RepositoryService
) {
    
    /**
     * 部署请假审批流程
     * 企业场景:HR管理员上传新的请假流程BPMN文件
     */
    fun deployLeaveProcess(bpmnFile: MultipartFile): String {
        val deployment = repositoryService.createDeployment()
            .name("请假审批流程")
            .category("人事管理")
            .addInputStream(
                "leave-approval-process.bpmn20.xml", 
                bpmnFile.inputStream
            )
            .deploy()
        
        println("部署成功!部署ID: ${deployment.id}")
        println("部署名称: ${deployment.name}")
        println("部署时间: ${deployment.deploymentTime}")
        
        return deployment.id
    }
}

示例2:从类路径部署流程(采购审批)

kotlin
import org.flowable.engine.RepositoryService
import org.springframework.stereotype.Service

@Service
class ProcurementProcessService(
    private val repositoryService: RepositoryService
) {
    
    /**
     * 从类路径部署采购审批流程
     * 企业场景:系统初始化时自动部署内置的采购流程
     */
    fun deployProcurementProcess() {
        repositoryService.createDeployment()
            .name("采购审批流程-V2.0")
            .category("供应链管理")
            .addClasspathResource("processes/procurement-approval.bpmn20.xml")
            .addClasspathResource("forms/procurement-form.form")
            .deploy()
        
        println("采购流程部署成功")
    }
}

示例3:多租户部署(SaaS平台)

kotlin
import org.flowable.engine.RepositoryService
import org.springframework.stereotype.Service

@Service
class MultiTenantDeploymentService(
    private val repositoryService: RepositoryService
) {
    
    /**
     * 为特定租户部署定制流程
     * 企业场景:SaaS平台为新入驻的企业客户部署专属流程
     */
    fun deployProcessForTenant(
        tenantId: String,
        processName: String,
        bpmnXml: String
    ): String {
        val deployment = repositoryService.createDeployment()
            .name("$processName-租户$tenantId")
            .category("租户定制流程")
            .tenantId(tenantId)
            .addString("process.bpmn20.xml", bpmnXml)
            .deploy()
        
        return deployment.id
    }
}

示例4:启用重复过滤(避免重复部署)

kotlin
import org.flowable.engine.RepositoryService
import org.springframework.stereotype.Service

@Service
class ContractProcessService(
    private val repositoryService: RepositoryService
) {
    
    /**
     * 部署合同审批流程(自动过滤重复)
     * 企业场景:持续集成环境中,避免每次构建都创建新的部署版本
     */
    fun deployContractProcessWithDuplicateFiltering() {
        repositoryService.createDeployment()
            .name("合同审批流程")
            .category("法务管理")
            .addClasspathResource("processes/contract-approval.bpmn20.xml")
            .enableDuplicateFiltering() // 如果内容相同,不创建新版本
            .deploy()
        
        println("合同流程部署完成(已自动过滤重复)")
    }
}

示例5:部署时设置部署Key(版本管理)

kotlin
import org.flowable.engine.RepositoryService
import org.springframework.stereotype.Service
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

@Service
class ExpenseProcessService(
    private val repositoryService: RepositoryService
) {
    
    /**
     * 部署报销审批流程并设置版本Key
     * 企业场景:财务部门按月度发布报销流程新版本,便于追踪管理
     */
    fun deployExpenseProcessWithVersion(): String {
        val versionKey = "expense-process-${
            LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMM"))
        }"
        
        val deployment = repositoryService.createDeployment()
            .name("报销审批流程")
            .category("财务管理")
            .key(versionKey) // 设置部署Key,便于后续查询
            .addClasspathResource("processes/expense-approval.bpmn20.xml")
            .addClasspathResource("processes/expense-sub-process.bpmn20.xml")
            .deploy()
        
        println("报销流程部署成功,版本Key: $versionKey")
        return deployment.id
    }
}

示例6:完整的流程部署管理类

kotlin
import org.flowable.engine.RepositoryService
import org.flowable.engine.repository.Deployment
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

@Service
class ProcessDeploymentManager(
    private val repositoryService: RepositoryService
) {
    
    /**
     * 部署完整的业务流程包
     * 企业场景:项目上线时,一次性部署所有相关流程资源
     */
    @Transactional
    fun deployBusinessProcessPackage(
        moduleName: String,
        bpmnResources: List<String>,
        formResources: List<String> = emptyList(),
        dmnResources: List<String> = emptyList()
    ): Deployment {
        
        val deploymentBuilder = repositoryService.createDeployment()
            .name("$moduleName-业务流程包")
            .category("业务模块")
        
        // 添加BPMN流程定义
        bpmnResources.forEach { resource ->
            deploymentBuilder.addClasspathResource(resource)
        }
        
        // 添加表单定义
        formResources.forEach { resource ->
            deploymentBuilder.addClasspathResource(resource)
        }
        
        // 添加决策表
        dmnResources.forEach { resource ->
            deploymentBuilder.addClasspathResource(resource)
        }
        
        val deployment = deploymentBuilder.deploy()
        
        println("=== 业务流程包部署成功 ===")
        println("模块名称: $moduleName")
        println("部署ID: ${deployment.id}")
        println("BPMN文件数: ${bpmnResources.size}")
        println("表单文件数: ${formResources.size}")
        println("决策表文件数: ${dmnResources.size}")
        
        return deployment
    }
}

注意事项

1. 版本管理

  • 每次部署会创建新版本,即使流程定义Key相同
  • 使用 enableDuplicateFiltering() 可避免内容相同时创建新版本
  • 建议使用 key() 方法为部署设置有意义的标识,便于版本追踪

2. 资源命名规范

  • BPMN文件必须以 .bpmn20.xml.bpmn 结尾
  • 表单文件建议以 .form 结尾
  • DMN决策表文件以 .dmn.dmn11.xml 结尾

3. 多租户隔离

  • 在SaaS场景中,必须使用 tenantId() 进行租户隔离
  • 不同租户的流程定义相互独立,互不影响

4. 事务管理

  • 部署操作会立即持久化到数据库
  • 建议在 @Transactional 方法中执行,确保与其他数据库操作的一致性

5. 权限控制

  • 生产环境应限制部署权限,仅允许管理员或特定角色执行
  • 建议记录部署操作日志,包括操作人、时间、内容等

6. 性能考虑

  • 批量部署多个资源时,建议在一个 DeploymentBuilder 中完成
  • 避免在高并发场景下频繁部署,会影响系统性能

7. 回滚策略

  • Flowable不支持自动回滚部署,需手动管理版本
  • 建议保留历史版本的BPMN文件,以便必要时重新部署

相关 API

  • RepositoryService.createDeployment() - 创建部署构建器
  • RepositoryService.createDeploymentQuery() - 查询已有部署
  • RepositoryService.deleteDeployment() - 删除部署
  • RepositoryService.getDeploymentResourceNames() - 获取部署中的资源列表
  • RepositoryService.getResourceAsStream() - 读取部署资源内容

最佳实践

1. CI/CD 集成

kotlin
@Service
class CICDDeploymentService(
    private val repositoryService: RepositoryService
) {
    
    fun deployFromCICD(gitCommitHash: String, resourcePath: String) {
        repositoryService.createDeployment()
            .name("自动部署-$gitCommitHash")
            .category("CI/CD")
            .key("deployment-$gitCommitHash")
            .addClasspathResource(resourcePath)
            .enableDuplicateFiltering()
            .deploy()
    }
}

2. 部署前验证

kotlin
fun deployWithValidation(bpmnXml: String) {
    // 先验证流程定义
    val bpmnModel = repositoryService.validateProcess(bpmnXml)
    
    if (bpmnModel.isNotEmpty()) {
        // 验证通过后再部署
        repositoryService.createDeployment()
            .name("已验证的流程")
            .addString("process.bpmn20.xml", bpmnXml)
            .deploy()
    }
}

本文档说明

  • 基于 Flowable 7.1.0 版本编写
  • 所有示例均可直接在 Spring Boot + Kotlin 项目中使用
  • 示例场景来自真实企业应用,具有实际参考价值