锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
"<process-definition>" +
" <start-state>" +
" <transition to='s' />" +
" </start-state>" +
" <state name='s'>" +
" <transition to='end' />" +
" </state>" +
" <end-state name='end' />" +
"</process-definition>"
);
ProcessInstance processInstance =new ProcessInstance(processDefinition);
Token token = processInstance.getRootToken();
assertSame(processDefinition.getStartState(), token.getNode());
token.signal();
assertSame(processDefinition.getNode("s"), token.getNode());
token.signal();
assertSame(processDefinition.getNode("end"), token.getNode());
}
棣栧厛錛屾垜浠畾涔変釜嫻佺▼妯℃澘錛圥rocessDefinition錛夛紝灝辨槸涓婇潰浠g爜鐨凱rocessDefinition processDefinition = ProcessDefinition.parseXmlString(….);榪欐錛屽湪鎷彿涓槸jbpm瀹氫箟鐨勬祦紼嬶紝鍏朵腑鍖呮嫭涓変釜鐜妭錛屽垎鍒槸starts-state銆乻tate鍜宔nd-state銆俻arseXmlString錛堬級鏂規硶鐨勪富瑕佸姛鑳芥槸瑙f瀽榪欐xml璇█榪斿洖涓祦紼嬫ā鏉垮璞★紙processDefinition錛夈?br />
鎺ョ潃錛岄氳繃嫻佺▼瀹炰緥綾伙紙ProcessInstance錛夋潵瀹炰緥鍖栦釜嫻佺▼瀹炰緥錛岄氳繃浼犺繘鏉ョ殑嫻佺▼妯℃澘瀵硅薄鍒涘緩ProcessInstance processInstance =new ProcessInstance(processDefinition)銆傛垜浠潵鐪嬬湅new ProcessInstance(processDefinition)鍒板簳鍋氫簡浠涔堬紝閫氳繃鏌ョ湅ProcessInstance鐨勬簮浠g爜錛屽彲浠ョ湅鍒板叾涓富瑕佺殑涓孌墊槸
public ProcessInstance( ProcessDefinition processDefinition ) {
//鐣ュ幓鍏朵粬浠g爜
this.processDefinition = processDefinition; //灝嗘祦紼嬫ā鏉垮璞′粯緇欐祦紼嬪疄渚?br />
this.rootToken = new Token(this); //鍒涘緩璺熶護鐗?br />
//鐣ュ幓鍏朵粬浠g爜
}
鎴戜滑緇х畫璺熻繘Token榪欎釜綾?br />
public Token(ProcessInstance processInstance) {
//涓昏涓鍙ュ涓?br />
this.node = processInstance.getProcessDefinition().getStartState();
}
榪欐牱灝卞疄鐜頒簡浠ょ墝緇戝畾鍒板紑濮嬭妭鐐廣傝嚦姝わ紝涓涓祦紼嬪疄渚嬪氨鍒涘緩璧鋒潵浜嗭紝騫朵笖璇ユ祦紼嬪疄渚嬭蛋鍒頒簡寮濮嬭妭鐐癸紝鍗充護鐗屾墍澶勭殑浣嶇疆銆?br />
鎴戜滑鎺ョ潃寰涓嬭蛋token.signal()
public void signal() {
signal(node.getDefaultLeavingTransition(), new ExecutionContext(this));
//榪欓噷鐨刧etDefaultLeavingTransition()濡傛灉鏈夊鏉¤礬寰勶紝鍒欏幓絎竴鏉¤礬寰?br />
}
void signal(Transition transition, ExecutionContext executionContext) {
//鐪佺暐鍏朵粬浠g爜
node.leave(executionContext, transition);
//鐪佺暐鍏朵粬浠g爜
}
榪欓噷鐨刵ode灝辨槸鍒氭墠浠ょ墝鎵鍦ㄧ殑寮濮嬭妭鐐癸紝鎴戜滑鏉ョ湅鐪媕bpm鏄浣曞皢浠ょ墝浠庡紑濮嬭妭鐐圭Щ鍒頒笅涓妭鐐圭殑銆?br />
public void leave(ExecutionContext executionContext, Transition transition) {
Token token = executionContext.getToken();
token.setNode(this);//姝ゆ椂浠ょ墝榪樺湪寮濮嬭妭鐐?br />
executionContext.setTransition(transition);
//鐣ュ幓閮ㄥ垎浠g爜
executionContext.setTransitionSource(this);
transition.take(executionContext);//瀹炵幇浠ょ墝鐨勮漿縐?br />
}
鎴戜滑鏉ョ湅鐪媡ransition.take(..)鏂規硶鍋氫簡浠涔?br />
public void take(ExecutionContext executionContext) {
//鐣ュ幓閮ㄥ垎浠g爜
to.enter(executionContext);//紱誨紑寮濮嬭妭鐐癸紝榪涘叆鍒頒笅涓妭鐐?br />
}
澶у鍙兘浼氭湁鐐圭枒闂紝榪欎釜to鑺傜偣鏄粈涔堟槸鍚﹀垵濮嬪寲鐨勶紵鍏跺疄鍦╯ignal鏃舵湁鍙ode.getDefaultLeavingTransition()錛岃繖鍙ヨ繑鍥濼ransition瀵硅薄錛岃瀵硅薄灝卞凡緇忓垵濮嬪寲浜唗o鑺傜偣鐨勫璞°傛垜浠湪璺熻繘to.enter(..)
public void enter(ExecutionContext executionContext) {
Token token = executionContext.getToken();
token.setNode(this);//姝ゆ椂浠ょ墝灝卞埌浜嗗悕瀛椾負“s”鐨剆tate鑺傜偣
token.setNodeEnter(new Date());
executionContext.setTransition(null);
executionContext.setTransitionSource(null);
execute(executionContext);
}
鍦ㄨ繖孌典唬鐮佷腑鐨勬敞閲婅繖鍙ワ紝鐪熸瀹炵幇浜嗕護鐗屼粠寮濮嬭妭鐐瑰埌涓嬩釜鑺傜偣浜嗐?br />
鑷蟲錛宩bpm宸ヤ綔嫻佸紩鎿庣殑鍐呴儴宸ヤ綔鍘熺悊灝變粙緇嶅畬浜嗭紝鍏跺疄榪欏氨鏄伐浣滄祦寮曟搸鏈鏍稿績鐨勯儴鍒嗕簡錛屽氨鏄浣曚粠涓涓幆鑺傝漿縐誨埌鍙︿竴涓幆鑺傘傛垨璁鎬綘浼氳“榪欎箞綆鍗曪紝鎴戦┈涓婂氨鍙互鍐欎竴涓?#8221;錛屽叾瀹炰笉鐒訛紝涓婇潰鎴戜滑鎵鐢ㄧ殑渚嬪瓙鏄崄鍒嗙畝鍗曠殑渚嬪瓙錛屽叾瀹炲湪宸ヤ綔嫻佽仈鐩熻鑼冧腑榪樻湁鍏朵粬澶嶆潅鐨勮妭鐐規ā鍨嬶紝濡俿plit錛宩oin錛宻ubflow絳夈備笉榪囧垢榪愮殑鏄繖浜涘鏉傜殑鑺傜偣妯″瀷jbpm閮戒負鎴戜滑鎻愪緵浜嗕粬鑷繁鐨勯粯璁ょ殑瀹炵幇錛岃繖浜涜妭鐐規ā鍨嬮兘鍦╫rg.jbpm.graph.node鍖呬笅銆俲bpm寮曟搸涓緢濂界殑鎶借薄浜嗚妭鐐規ā鍨婲ode綾伙紝澶ч儴鍒嗙殑澶嶆潅鑺傜偣妯″瀷閮界戶鎵胯嚜Node錛屾垜浠篃鍙互瀹氬埗鑷繁鐨勮妭鐐癸紝鍙瀹炵幇Node綾葷殑execute()鏂規硶鍗沖彲鏂逛究鐨勫疄鐜般傚叾瀹炰粠涓婇潰鍒嗘瀽鐨勪唬鐮佸彲浠ョ湅鍑猴紝Node綾諱富瑕佺殑閫昏緫澶勭悊鏄湪leave()銆乪nter()鍜宔xecute()涓変釜鏂規硶錛屽ぇ瀹跺彲浠ョ湅涓婸rocessState錛宩oin錛宖ork榪欎簺鑺傜偣妯″瀷鏄浣曞疄鐜扮殑銆?br />
浠ヤ笂綆鍗曚粙緇嶄簡jbpm寮曟搸鍐呮牳鐨勫伐浣滃師鐞嗭紝濡傛湁涓嶅鐨勫湴鏂硅繕鏈涙寚姝c?br />