Skip to content

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 项目中使用