如何在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
相关产品推荐
相关产品推荐

