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

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网理论上,应该可以是类似的
在 Activiti 7.0 中,工具类主要用于流程引擎的初始化、流程定义的部署、流程实例的启动以及任务的处理等操作。以下是一些常用的工具类和使用指南。 ### 初始化流程引擎 Activiti 提供了 `ProcessEngines` 类来创建和获取 `ProcessEngine` 实例。`ProcessEngine` 是 Activiti 的核心接口,用于获取各种服务,如 `RepositoryService`、`RuntimeService`、`TaskService` 等。 ```java ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); ``` ### 部署流程定义 `RepositoryService` 用于部署流程定义文件(如 BPMN 文件)到 Activiti 引擎中。 ```java RepositoryService repositoryService = engine.getRepositoryService(); Deployment deployment = repositoryService.createDeployment() .addClasspathResource("processes/your-process.bpmn") .deploy(); ``` ### 启动流程实例 `RuntimeService` 用于启动流程实例,并可以传递流程变量。 ```java RuntimeService runtimeService = engine.getRuntimeService(); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("processKey", variables); ``` ### 查询和完成任务 `TaskService` 用于查询用户任务并完成任务。 ```java TaskService taskService = engine.getTaskService(); List<Task> tasks = taskService.createTaskQuery() .taskAssignee("assignee") .list(); for (Task task : tasks) { taskService.complete(task.getId()); } ``` ### 查询历史数据 `HistoryService` 用于查询历史数据,如已完成的流程实例、任务等。 ```java HistoryService historyService = engine.getHistoryService(); HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); ``` ### 示例工具类 下面是一个简单的工具类示例,用于封装 Activiti 的常用操作。 ```java public class ActivitiUtil { private static ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); public static void deployProcess(String bpmnPath) { RepositoryService repositoryService = engine.getRepositoryService(); repositoryService.createDeployment() .addClasspathResource(bpmnPath) .deploy(); } public static ProcessInstance startProcess(String processKey, Map<String, Object> variables) { RuntimeService runtimeService = engine.getRuntimeService(); return runtimeService.startProcessInstanceByKey(processKey, variables); } public static void completeTask(String taskId) { TaskService taskService = engine.getTaskService(); taskService.complete(taskId); } public static HistoricProcessInstance getHistoricProcessInstance(String processInstanceId) { HistoryService historyService = engine.getHistoryService(); return historyService.createHistoricProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值