You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Activity任务中获取当前运行流程的Process Instance ID?

嘿,我猜你说的是Activiti工作流吧?毕竟提到了流程实例ID和任务,这个需求在日常开发里挺常见的,我给你整理几种不同场景下的实现方法,你按需选就行:

获取Activiti任务关联的流程实例ID的几种实现方式

1. 服务任务(JavaDelegate)场景

如果你的任务是服务任务,用JavaDelegate实现业务逻辑,直接从DelegateExecution对象里拿就可以,这是最直接的方式:

public class MyServiceTaskHandler implements JavaDelegate {
    @Override
    public void execute(DelegateExecution execution) {
        // 直接获取流程实例ID
        String processInstanceId = execution.getProcessInstanceId();
        // 这里可以做你需要的操作,比如记录日志、关联业务数据等
        System.out.println("当前运行的流程实例ID: " + processInstanceId);
    }
}

DelegateExecution本身就携带了流程的核心上下文信息,调用getProcessInstanceId()就能拿到你要的ID。

2. 任务监听器(Task Listener)场景

如果是在任务监听器(比如任务创建、完成时触发的逻辑)中,你会拿到DelegateTask对象,有两种方式获取流程实例ID:

public class MyTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        // 方式一:通过关联的Execution获取
        String processInstanceId = delegateTask.getExecution().getProcessInstanceId();
        
        // 方式二:直接调用DelegateTask的方法(更稳妥,避免Execution为空的极端情况)
        // String processInstanceId = delegateTask.getProcessInstanceId();
        
        System.out.println("当前流程实例ID: " + processInstanceId);
    }
}

推荐用第二种方式,因为极少数情况下任务可能没有关联到Execution(比如独立任务),直接调用delegateTask.getProcessInstanceId()不会出现空指针问题。

3. 脚本任务(Script Task)场景

如果是用Groovy、JavaScript等脚本任务实现逻辑,Activiti的脚本环境已经内置了上下文变量,直接用就行:

  • Groovy示例:
// 两种方式都可以
def processInstanceId = execution.getProcessInstanceId()
// 或者直接用内置的processInstanceId变量
def processInstanceId = processInstanceId

println("当前流程实例ID: " + processInstanceId)
  • JavaScript示例:
var processInstanceId = execution.getProcessInstanceId();
console.log("当前流程实例ID: " + processInstanceId);

4. 已知任务ID的外部查询场景

如果你手里只有任务ID(比如从业务系统接口拿到的taskId),可以通过Activiti的TaskService反向查询流程实例ID:

// 先注入TaskService
@Autowired
private TaskService taskService;

public String getProcessInstanceIdByTaskId(String taskId) {
    Task task = taskService.createTaskQuery()
            .taskId(taskId)
            .singleResult();
            
    return task != null ? task.getProcessInstanceId() : null;
}

这种方式适合在流程外部(比如业务系统的管理后台)需要通过任务关联到流程的场景。

额外小技巧

拿到流程实例ID后,你还可以通过RuntimeService查询流程实例的详细信息,比如状态、启动人、流程变量等:

@Autowired
private RuntimeService runtimeService;

ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
        .processInstanceId(processInstanceId)
        .singleResult();
        
// 比如获取流程启动人
String startUserId = processInstance.getStartUserId();
// 获取流程状态
boolean isActive = processInstance.isActive();

内容的提问来源于stack exchange,提问作者Nik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:24:58