1. 程式人生 > >[] taskService.completeTask(task.getId());的執行過程分析

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

相關推薦

[] taskService.completeTask(task.getId());的執行過程分析

taskservice.completetask(task.getid());單步跟蹤下去的順序1、執行函式體內,得到dbid,感覺是注入到這個id去的。在taskimpl中有setdbid的方法2、commandservice.execute(new completetas

Task執行過程分析5——ReduceTask內部實現

與MapTask一樣,ReduceTask也分為四種,即Job-setup Task,Job-cleanup Task,Task-cleanup Task和Reduce Task。本文重點介紹第四種——普通Reduce Task。 Reduce Task要從各

u-boot、kernel和filesystem 執行過程分析

標題:   Uboot -kerne-root 啟動流程 內容:   ※uboot啟動流程   ※Kernel啟動流程   ※Root啟動流程   ※構建根檔案系統   /********************************* *u-boot

spring MVC執行過程分析與原始碼實現

spring mvc 啟動過程可分為如下3步: =============================================                             web.xml                           Dispa

rbd map 執行過程分析

分析的 ceph 程式碼版本:  12.2.4 分析的 kernel 程式碼版本:  4.16.0 在執行 `rbd map <pool_name>/<image_name>` ,整個執行流程是如何完成的呢? 這個 map 主要可以分為兩個部

從JS執行過程分析閉包的概念

(自己理解,有誤請指正 ) 首先,閉包這個詞真讓人難理解,中華文化博大精深,講究見名知意,但是閉包確實是理解一門語言特性中不可或缺的一個東西,網路上資料千奇百怪,講了一通也很難讓人有醍醐灌頂的感覺,這裡我來說一說我對閉包的理解: # 閉包是和特定語言無關的東西 # 閉包是指的是通過特

RMI執行過程分析

客戶端程式碼 public class RMIClient { public static void main(String... args) throws RemoteException, NotBoundException, Malformed

Mapreduce執行過程分析(基於Hadoop2.4)——(一)

轉載自:http://www.cnblogs.com/Scott007/p/3836687.html 1 概述 該瞅瞅MapReduce的內部執行原理了,以前只知道個皮毛,再不搞搞,不然怎麼死的都不曉得。下文會以2.4版本中的WordCount這個經典例子作為分析的

【QT】Qt 5.9 QWidget程式執行過程分析

一個最簡單的QWidget程式可能是下面這個樣子: int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; w.show();

CUDPP基本執行過程分析

CUDPPResult cudppPlan(constCUDPPHandle cudppHandle, CUDPPHandle*planHandle, CUDPPConfiguration config, size_t numElements, size_t n

HAL MODULE 執行過程分析

hw_get_module()->property_get(variant_keys[i],prop,NULL)->__system_property_get(key, value) ->__system_property_find(const char *name)-> __syst

multiprocessing多程序的執行過程分析

import os from multiprocessing import Process #multiprocessing 跨平臺,可以支援Linux和Windows print("***程序%d"%

AntCall Task執行過程中呼叫並執行其他target

AntCall 任務的作用是允許在一個target的執行過程中呼叫並執行其他的target。例如,在打包專案前需要對專案進行編譯,那麼可以在打包專案的target中通過AntCall任務使得編譯的target先執行。當然這種情況也可以通過target間設定depends屬性來

系統呼叫執行過程分析

#####################################作者:張卓原創作品轉載請註明出處:《Linux作業系統分析》MOOC課程 http://www.xuetangx.com/courses/course-v1:ustcX+USTC001+_/about

HAL module執行過程分析

hw_get_module()->property_get(variant_keys[i],prop,NULL)->__system_property_get(key, value) ->__system_property_find(const char *name)-> __syst

mybatis原始碼學習之執行過程分析(2)——config.xml配置檔案和mapper.xml對映檔案解析過程

在上一篇中跟蹤了SqlSessionFactory及SqlSession的建立過程。這一篇,主要跟蹤Mapper介面和XML檔案對映及獲取。 1.xml檔案的解析 1.1Mybatis-config.xml的解析 在SqlSessionFactor

【imx6ul】U-Boot 2016.03執行過程分析-ARM Cortex-A7

uboot組織架構正在朝著linux架構方向發展,不同版本稍有不同,一下以U-Boot 2016.03為例。分析入口:以u-boot.lds(其決定了各個段的排布方式)開始:1、u-boot.lds://設定輸出檔案大小端格式 OUTPUT_FORMAT("elf32-lit

sql執行過程分析

我們總是寫sql語句,資料庫把結果返回給我們,那中間過程又是什麼?如果瞭解oracle是怎麼執行sql語句的中間過程,對我們優化sql有很大的幫助 首先了解一下執行sql,需要消耗什麼資源, cpu, 記憶體, io, 我們要了解什麼情況下會消耗cpu,什麼情況下消耗記憶體,

mplayer的執行過程分析(本地、網路)

main函式流程分析,分本地和網路兩種情況  1. 本地檔案的播放,以mp3檔案的播放為例,命令列輸入:mplayer test.mp3     只給出關鍵步驟  2. open_stream,                                        開啟檔案流          ope

MapReduce執行過程分析【問題】

這個是個問題貼,由about雲會員提問。會員答疑。提問和回答都比較有水平,分享出來。1. Map