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网理论上,应该可以是类似的
分享到:
相关推荐
taskService.addCandidateUser(task.getId(), "user1"); taskService.addCandidateUser(task.getId(), "user2"); // 用户user1领取并完成任务 taskService.claim(task.getId(), "user1"); taskService.complete...
TaskDefinition taskDef = taskService.NewTask(); taskDef.RegistrationInfo.Description = "这是一个测试计划任务"; taskDef.Settings.DisallowStartIfOnBatteries = false; // 设置任务是否允许在电池模式下运行 ...
开发人员可以通过`taskService.createTaskQuery()`创建一个查询,然后根据不同的条件(如任务状态、负责人等)过滤出待处理的任务。获取到任务后,可以使用`taskService.getTask()`方法获取任务的详细信息。 "完成...
在Activiti的学习过程中,个人任务是流程执行中的一个重要环节。个人任务是指特定的任务指派给了流程中的某一个用户,该用户有责任完成这个任务。本篇学习笔记将深入探讨如何在Activiti中进行个人任务的分配。 一、...
完成流程操作taskService.completeTask completeTask(taskId) completeTask(taskId, variables) completeTask(taskId, outcome) completeTask(taskId, outcome, variables) 根据指定任务的ID,指定下一步的转移路径...
taskService.complete(task.getId(), "approver", null); } ``` ### 6. 监控流程 jbpm提供了监控工具,可以查看流程实例的状态、任务分配和历史记录。这对于理解流程执行情况和优化流程非常有帮助。 ### 7. 示例...
ServiceTask 可以在执行过程中读取和修改流程变量。使用 `${variableName}` 表达式可以访问变量,而 `setVariable` 方法则用于设置变量值。 8. **边界事件与异常处理** ServiceTask 支持边界事件,例如错误、信号...
taskService.start(task.getId(), "john"); taskService.complete(task.getId()); ``` 5. **jbpm的扩展性** - **工作流服务**:jbpm可以通过服务组件接口(Service Task)与其他系统交互,如数据库、Web服务等...
taskService.claim(task.getId(), "admin"); // 完成任务 taskService.complete(task.getId()); } ``` 以上就是jbpm3的基本知识概览,涵盖了其核心概念、功能和API的使用。通过这些,开发者可以构建出强大的业务...
taskService.claim(task.getId(), "currentUser"); taskService.complete(task.getId()); } } ``` 最后,为了方便监控和管理流程实例,我们可以集成Activiti提供的Actuator模块,或者使用Activiti提供的Web应用...
var task = taskService.RootFolder.RegisterTaskDefinition("MyTask", taskDefinition); ``` 5. 需要时,可以通过`Task`对象进行查询、更新或删除任务。 ```csharp var registeredTask = taskService.GetTask("My...
taskService.complete(task.getId(), Collections.singletonMap("taskEntity", entity)); } } ``` **七、控制器接口** 创建SpringBoot的RESTful API控制器,提供增删改查的接口。 ```java @RestController @...
Task task = taskService.createTaskQuery().processInstanceId(pi.getId()) .singleResult(); // 设置任务附件 taskService.createAttachment("weburl", task.getId(), pi.getId(), "163.com", "163webpage...
taskService.complete(task.getId()); } } ``` 以上就是使用 Maven 初始化一个基于 Activiti 的项目的基本步骤。随着项目的深入,你可能需要处理更复杂的流程逻辑、集成其他服务、优化性能等。在实际应用中,...
taskService.addPotentialOwner(task.getId(), userId); } ``` #### 五、注意事项 1. **流程变量的正确设置**:确保在流程执行过程中正确地设置了流程变量,并且这些变量的值能够被后续任务所使用。 2. **权限...
taskService.complete(task.getId()); } ``` 此外,Activiti还提供了丰富的API,例如查询历史流程实例、监控流程状态、监听器等,可以满足复杂业务场景的需求。 总之,Spring Boot结合Activiti能为企业级应用提供...
taskService.complete(task.getId()); } ``` 6. **中文乱码问题**: 在处理流程中的中文内容时,可能遇到乱码问题。解决方案是在部署流程定义时设置字符集,以及在数据库连接配置中指定字符集。例如: ```java ...
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult(); taskService.complete(task.getId()); ``` 通过以上步骤,你就成功地在 Eclipse 中搭建了一个基本的 ...
taskService.claim(task.getId(), "userId"); } public void completeTask(String taskId, Map, Object> variables) { taskService.complete(taskId, variables); } } ``` 7. 二级审批demo 二级审批流程通常...
taskService.complete(task.getId()); System.out.println("完成!"); } } ``` 4. **解决编译错误**: - 确保已正确导入所有必需的Activiti包。 - 添加Oracle JDBC驱动到项目的类路径中。 5. **运行测试**: ...