[] 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網理論上,應該可以是類似的