Appearance
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 项目中使用
- 示例场景来自真实企业应用,具有实际参考价值