taskService.completeTask(task.getId());的执行过程分析

本文深入分析了Jbpm中`taskService.completeTask(task.getId())`的执行过程,从TaskImpl的设置到数据库交互,再到CommandService的调用,详细解释了CompleteTaskCmd中的操作,包括任务状态更新、历史事件处理、数据库会话操作以及ExecutionImpl的信号传递。整个流程涉及原子操作、活动行为和流程控制,展示了Jbpm内部任务完成的复杂逻辑。
部署运行你感兴趣的模型镜像
taskService.completeTask(task.getId());
单步跟踪下去的顺序
1、执行函数体内,得到dbid,感觉是注入到这个id去的。在taskimpl中有setdbid的方法
2、commandService.execute(new CompleteTaskCmd(taskId));
3、在CompleteTaskCmd中,public Void execute(Environment environment) throws Exception
{
//要从数据库中取数据,因为task是在进入节点的时候,产生到数据库中的

TaskImpl task = dbSession.get(TaskImpl.class, Long.parseLong(taskId));


if (outcomeSpecified) {
task.complete(outcome);
} else {
task.complete();
}
}
在Complete中
//它在历史事件中Update了historytask,主要是更新了endtime及setTransitionName

historyTaskComplete(outcome);
//在historyEvent 基类下,有taskCreate等多个子类,每个子类,都采用模板的Process的方式。说明任务在创建到结束的时候,该事件都会被启动

DbSession dbSession = EnvironmentImpl.getFromCurrent(DbSession.class, false);
if (dbSession!=null){
dbSession.delete(this);//应该是删除task本身的任务
}

if (isSignalling()) {
ClientExecution execution = getExecution();
execution.signal(outcome);
//进入了ExecutionImpl的signal的方法
public void signal(String signal, Map<String, ?> parameters) {
checkActive();
if (getProcessDefinition().isSuspended()) {
throw new JbpmException("process definition "+getProcessDefinition().getId()+" is suspended");
}
propagation = Propagation.EXPLICIT;
if (getActivity()!=null) {
performAtomicOperation(new Signal(signal, parameters));
//signal也是AtomicOperation子类,但是这个时候,无法通过字符串常量方式写入。
在这里面,主要执行了
activityBehaviour.signal(execution, signalName, parameters);
进入了taskActivity(是activityBehaviour的子类)的signal中。

execution.fire(signalName, activity);在这个fire中,产生了事件的原子操作
AtomicOperation.EXECUTE_EVENT_LISTENER。
然后进入了 public void take(Transition transition) {
fire(Event.END, getActivity(), AtomicOperation.TRANSITION_END_ACTIVITY);
然后执行 TransitionTake
然后执行 TRANSITION_START_ACTIVITY


感觉在 while (! atomicOperations.isEmpty()) {
AtomicOperation atomicOperation = atomicOperations.poll();
atomicOperation.perform(this);
}
处使用了递归的过程

}

}
else if (transition != null) {
performAtomicOperation(AtomicOperation.TRANSITION_START_ACTIVITY);
}
else {
throw new JbpmException("execution is not in a activity or in a transition");
}
}


//
}

if (superTask != null) {
superTask.subTaskComplete(this, outcome);
}


感觉:在Atomic几个子类操作的互转过程,与信号量的Perti网理论上,应该可以是类似的

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

Java代码操作activiti工作流,方法如下: public Response<ProcessVo> completeTask(ProcessDto dto) { Task task = this.taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult(); String instanceId = task.getProcessInstanceId(); if (StrUtil.isNotBlank(dto.getComment())) { this.taskService.addComment(task.getId(), instanceId, dto.getComment()); } // this.taskService.createAttachment("url", task.getId(), task.getProcessInstanceId(), "附件名", "啥都没有", "https://xxxxxxxxx"); // 判断节点 if (StrUtil.equals(ProcessConstants.NEW_GEN_AI_UPLOAD_DOC, task.getTaskDefinitionKey())) { // 待上传节点,文档状态:新建,工单状态:待审核 Map<String, Object> variables = new HashMap<>(); variables.put("candidateUsers", this.auditGroup()); this.taskService.complete(task.getId(), variables); } else if (StrUtil.equals(ProcessConstants.NEW_GEN_AI_AUDIT, task.getTaskDefinitionKey())) { // 文档审核节点,文档状态:审核通过-待清洗,不通过-新建,工单状态:待上传清洗文档、待上传 Map<String, Object> variables = new HashMap<>(); variables.put("auditDocResult", dto.getAuditResult()); this.taskService.complete(task.getId(), variables); } else if (StrUtil.equals(ProcessConstants.NEW_GEN_AI_UPLOAD_CLEAN_DOC, task.getTaskDefinitionKey())) { // 上传清洗文档节点,文档状态:已清洗,工单状态:待内部验证 // TODO: 清洗文档上传至百炼 Map<String, Object> variables = new HashMap<>(); variables.put("cleanDocResult", dto.getAuditResult()); this.taskService.complete(task.getId(), variables); } else if (StrUtil.equals(ProcessConstants.NEW_GEN_AI_INTERNAL_VALID, task.getTaskDefinitionKey())) { // 内部验证节点,文档状态:验证通过-已清洗,不通过(无需更新业务文档)-待清洗,不通过(需更新业务文档)-新建,工单状态:待UAT、待上传清洗文档、待上传 Map<String, Object> variables = new HashMap<>(); variables.put("internalValidResult", dto.getAuditResult()); this.taskService.complete(task.getId(), variables); } else if (StrUtil.equals(ProcessConstants.NEW_GEN_AI_UAT_VALID, task.getTaskDefinitionKey())) { // uat验证,文档状态:验证通过-待发布,验证不通过-待清洗,工单状态:UAT验证完成、待上传清洗文档 Map<String, Object> variables = new HashMap<>(); variables.put("uatValidResult", dto.getAuditResult()); this.taskService.complete(task.getId(), variables); } else if (StrUtil.equals(ProcessConstants.NEW_GEN_AI_RELEASE, task.getTaskDefinitionKey())) { // uat验证完成节点(发布节点),文档状态:已发布,工单状态-已完结 // TODO: 发布到生产 Map<String, Object> variables = new HashMap<>(); variables.put("releaseResult", dto.getAuditResult()); this.taskService.complete(task.getId(), variables); } Task nextTask = this.taskService.createTaskQuery() .processInstanceId(instanceId) .singleResult(); if (Objects.isNull(nextTask)) { ProcessVo processVo = new ProcessVo(); processVo.setTaskName("已完结"); processVo.setTaskDefKey("end"); return Response.success("流程结束", processVo); } // 设置候选人 if (StrUtil.isBlank(nextTask.getAssignee())) { String taskId = nextTask.getId(); List<String> candidateUsers = (List<String>) this.runtimeService.getVariable(instanceId, "candidateUsers"); candidateUsers.forEach(user -> this.taskService.addCandidateUser(taskId, user)); } String nextDef = nextTask.getTaskDefinitionKey(); log.info("下一个任务节点: {}", nextDef); ProcessVo processVo = new ProcessVo(); processVo.setInstanceId(nextTask.getProcessInstanceId()); processVo.setTaskId(nextTask.getId()); processVo.setTaskName(nextTask.getName()); processVo.setTaskDefKey(nextTask.getTaskDefinitionKey()); return Response.success(processVo); } 如何优化这个代码的耗时
最新发布
09-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值