Appearance
suspendProcessDefinitionByKey
Flowable 7.1.0 摘要:根据流程定义Key挂起流程定义,挂起后无法启动新的流程实例。
方法签名与说明
void suspendProcessDefinitionByKey(String processDefinitionKey)
挂起指定Key的流程定义的最新版本。挂起后,该流程定义无法启动新的流程实例,但已存在的流程实例不受影响。
Parameters:
- processDefinitionKey - 流程定义的Key,不能为null
Throws:
- FlowableObjectNotFoundException - 当流程定义不存在时
void suspendProcessDefinitionByKey(String processDefinitionKey, boolean suspendProcessInstances, Date suspensionDate)
挂起指定Key的流程定义,可选择是否同时挂起所有运行中的流程实例,并可指定挂起时间。
Parameters:
- processDefinitionKey - 流程定义的Key
- suspendProcessInstances - 是否同时挂起所有流程实例
- suspensionDate - 挂起生效时间(可为null表示立即生效)
常见使用场景
1. 流程临时停用
某个业务流程需要临时停用维护,挂起后禁止启动新实例。
2. 流程版本切换
在部署新版本流程前,先挂起旧版本,确保新实例使用新版本。
3. 系统维护
系统维护期间,临时挂起所有流程,维护完成后恢复。
Kotlin + Spring Boot 调用示例
示例1:挂起流程定义
kotlin
import org.flowable.engine.RepositoryService
import org.springframework.stereotype.Service
@Service
class ProcessSuspensionService(
private val repositoryService: RepositoryService
) {
/**
* 挂起流程定义
* 企业场景:请假流程临时停用,进入年度休假期
*/
fun suspendLeaveProcess() {
repositoryService.suspendProcessDefinitionByKey("leave-approval-process")
println("请假流程已挂起,暂停接受新申请")
}
}示例2:挂起流程并同时挂起所有实例
kotlin
import org.flowable.engine.RepositoryService
import org.springframework.stereotype.Service
@Service
class EmergencySuspensionService(
private val repositoryService: RepositoryService
) {
/**
* 紧急挂起流程(包括所有运行中的实例)
* 企业场景:发现流程缺陷,紧急停止所有相关流程
*/
fun emergencySuspend(processDefinitionKey: String) {
repositoryService.suspendProcessDefinitionByKey(
processDefinitionKey,
true, // 同时挂起所有流程实例
null // 立即生效
)
println("流程 $processDefinitionKey 及所有实例已紧急挂起")
}
}示例3:定时挂起流程
kotlin
import org.flowable.engine.RepositoryService
import org.springframework.stereotype.Service
import java.util.Calendar
import java.util.Date
@Service
class ScheduledSuspensionService(
private val repositoryService: RepositoryService
) {
/**
* 定时挂起流程
* 企业场景:节假日期间自动挂起某些流程
*/
fun scheduleSuspension(processDefinitionKey: String, suspensionDate: Date) {
repositoryService.suspendProcessDefinitionByKey(
processDefinitionKey,
false, // 不影响已有实例
suspensionDate // 指定时间生效
)
println("流程 $processDefinitionKey 将在 $suspensionDate 自动挂起")
}
/**
* 节假日挂起示例
*/
fun suspendForHoliday(processDefinitionKey: String) {
val holidayStart = Calendar.getInstance().apply {
set(2024, Calendar.OCTOBER, 1, 0, 0, 0)
}.time
scheduleSuspension(processDefinitionKey, holidayStart)
}
}示例4:REST API
kotlin
import org.flowable.engine.RepositoryService
import org.springframework.web.bind.annotation.*
@RestController
@RequestMapping("/api/processes")
class ProcessSuspensionController(
private val repositoryService: RepositoryService
) {
/**
* 挂起流程定义
*/
@PostMapping("/{processKey}/suspend")
fun suspendProcess(
@PathVariable processKey: String,
@RequestParam(defaultValue = "false") suspendInstances: Boolean
): Map<String, Any> {
return try {
repositoryService.suspendProcessDefinitionByKey(
processKey,
suspendInstances,
null
)
mapOf(
"success" to true,
"message" to "流程已挂起",
"processKey" to processKey,
"instancesSuspended" to suspendInstances
)
} catch (e: Exception) {
mapOf(
"success" to false,
"message" to "挂起失败: ${e.message}"
)
}
}
}注意事项
1. 影响范围
- 只影响新流程实例的启动
- 默认不影响已存在的流程实例
- 使用
suspendProcessInstances=true可同时挂起所有实例
2. 多版本处理
- 默认只挂起最新版本
- 如需挂起所有版本,需分别调用
3. 恢复操作
- 使用
activateProcessDefinitionByKey()恢复流程
4. 权限控制
- 挂起流程是重要操作,应严格控制权限
相关 API
RepositoryService.suspendProcessDefinitionByKey()- 挂起流程定义RepositoryService.activateProcessDefinitionByKey()- 激活流程定义RepositoryService.suspendProcessDefinitionById()- 按ID挂起RepositoryService.isProcessDefinitionSuspended()- 检查是否挂起
最佳实践
1. 挂起前通知
kotlin
fun suspendWithNotification(processKey: String) {
// 发送通知
notifyUsers("流程即将挂起维护")
// 挂起流程
repositoryService.suspendProcessDefinitionByKey(processKey)
}2. 记录挂起日志
kotlin
fun suspendWithLogging(processKey: String, reason: String) {
logger.info("挂起流程: $processKey, 原因: $reason")
repositoryService.suspendProcessDefinitionByKey(processKey)
}本文档说明
- 基于 Flowable 7.1.0 版本编写
- 所有示例均可直接在 Spring Boot + Kotlin 项目中使用