零全零美(www.zzgwt.com)
生活中的很多事情,并不像If...Else那么簡單!
BlogJava
首頁
新文章
聯(lián)系
管理
posts - 96,comments - 52,trackbacks - 0
<
2008年11月
>
日
一
二
三
四
五
六
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
隨筆分類
apache組件(4)
JavaScript(14)
jbpm(6)
oracle(5)
PL/SQL(1)
SEO(3)
tomcat(5)
ubuntu(16)
安全相關(guān)(26)
數(shù)據(jù)庫
正則表達(dá)式(6)
設(shè)計模式(3)
隨筆檔案
2012年9月 (1)
2012年7月 (3)
2012年6月 (2)
2009年11月 (36)
2009年10月 (18)
2009年9月 (1)
2009年2月 (1)
2009年1月 (1)
2008年11月 (9)
2008年9月 (1)
2008年8月 (1)
2008年7月 (4)
2008年6月 (2)
2008年5月 (6)
2008年4月 (11)
友情鏈接
www.modaotea.com
茶藝培訓(xùn) 茶樓管理
www.website371.com
鄭州做網(wǎng)站 鄭州網(wǎng)站建設(shè) 鄭州做網(wǎng)站公司 鄭州網(wǎng)站優(yōu)化 鄭州網(wǎng)站制作
河南省大井科技有限公司(www.zzgwt.com)
搜索
積分與排名
積分 - 152262
排名 - 402
最新評論
1.?re: 正則表達(dá)式學(xué)習(xí)筆記(1) 行的開始和結(jié)束、字符組、連字符、脫字符、用"."去匹配任意字符
贊
--性感電子
2.?re: Apache httpd+Jk+Tomcat實現(xiàn)JAVA服務(wù)器配置全解析(1):基礎(chǔ)環(huán)境搭建
什么嘛,我就是不懂這些才搜索的,我最需要的就是你省略的部分,如何配置安裝,唉,又得繼續(xù)找資料了。
--吐槽
3.?re: JavaScript學(xué)習(xí)筆記(1)變量的生命周期
寫的很好
--fwd
4.?re: SELinux學(xué)習(xí)(1):Can't connect to MySQL server on 'ip' (13) 的解決方案
沒玩過這東西啊呵呵
--臺式萬用表
5.?re: [原創(chuàng)]巧用System.getProperty()編譯現(xiàn)有工程的java文件
你不能用ANT嗎?
--DB Compare Tool
[原創(chuàng)]JBPM源碼解讀之:Fork
Fork節(jié)點在整個JBPM流程運轉(zhuǎn)過程中配合Join使用提供使多于一個的節(jié)點如:TaskNode、State等并行運行的作用,很可惜我們不能利用Fork提供的現(xiàn)有機制實現(xiàn)需求中經(jīng)常遇到的并發(fā)子流程的效果,當(dāng)然雖然JBPM并不支持并發(fā)子流程的機制,并不代表我們不能變通的實現(xiàn),我將在另一篇文章中詳細(xì)說明
我的并發(fā)子流程的實現(xiàn)方式
。
Fork類的注釋中說:if this fork behaviour is not sufficient for your needs, consider writing your own custom TokenHandler.看來連JBPM開發(fā)小組也意識到Fork可能不能滿足某些特殊的需求。注釋中還說Fork節(jié)點有三種配置方式,我很奇怪為什么代碼中只能找到兩種:
1、without configuration : in that case the fork will launch one new sub-token over each of the leaving tranisions of the fork node.
2、a script : can be used to calculate a collection of transition names at runtime. if a script is configured, the script must have exactly one variable with 'write' access. that variable should be assigned a java.util.Collection in the script expression.
Fork類繼承自Node并實現(xiàn)了Parsable接口。Fork類相對簡單,他的私有成員變量只有一個:
1
/** */
/**
2
* a script that calculates the transitionNames at runtime.
3
*/
4
Script script
=
null
;
Fork中的Script可以在運行時對Fork節(jié)點選擇Transition,所以在實際應(yīng)用中可以
使用Fork+Script的方式進行多路路由選擇
.但是有一點要特別注意:JBBM User Guide文檔中說:the script in a fork is not persisted. script in fork might be removed in later versions of jPDL,原本以為這句話的前半句是說Script不會被持久化進數(shù)據(jù)庫,實驗了才知道其實Script還是被存進了數(shù)據(jù)庫,這半句的意思應(yīng)該是說"fork中的script不被堅持",JBPM開發(fā)小組要在新版本中放棄Script,我相信他們一定會提供更好的解決方案,讓我們拭目以待。 Fork重寫了Node類的read(Element forkElement, JpdlXmlReader jpdlReader)方法,其主要作用是解析JPDL中Fork節(jié)點Script的配置,并初始化自己的成員變量script。下面是execute(ExecutionContext executionContext)方法中的相關(guān)處理
1
Token token
=
executionContext.getToken();
2
//
聲明離開轉(zhuǎn)向的集合
3
Collection transitionNames
=
null
;
4
//
聲明子Token容器
5
List forkedTokens
=
new
ArrayList();
6
7
//
如果沒有Script,默認(rèn)按照其父類Node的getLeavingTransitionsMap取得所有離開轉(zhuǎn)向
8
if
(script
==
null
)
{
9
transitionNames
=
getLeavingTransitionsMap().keySet();
10
}
else
{
11
//
如果有Script,按照規(guī)范該Script應(yīng)該返回一個Collection類型的數(shù)據(jù),作為Fork的離開轉(zhuǎn)向集合
12
Map outputMap
=
null
;
13
try
{
14
//
執(zhí)行Script,得到返回的Collection數(shù)據(jù)
15
outputMap
=
script.eval(token);
16
}
catch
(Exception e)
{
17
this
.raiseException(e, executionContext);
18
}
19
if
(outputMap.size()
==
1
)
{
20
Object result
=
outputMap.values().iterator().next();
21
if
(result
instanceof
Collection)
{
22
transitionNames
=
(Collection) result;
23
}
24
}
25
if
(transitionNames
==
null
)
{
26
throw
new
JbpmException(
"
script for fork '
"
+
name
+
"
' should produce one collection (in one writable variable):
"
+
transitionNames);
27
}
28
}
下面讓我們來看一下,F(xiàn)ork產(chǎn)生的子Token的命名方式:
1
/** */
/**
2
* 功能描述:為子Token取名字<BR>
3
*
@param
parent 父Token
4
*
@param
transitionName 離開轉(zhuǎn)向的名字
5
*/
6
protected
String getTokenName(Token parent, String transitionName)
{
7
String tokenName
=
null
;
8
//
如果transitionName不為空
9
if
(transitionName
!=
null
)
{
10
//
如果父Tokehn中不存在以transitionName命名的子Token
11
if
(
!
parent.hasChild(transitionName))
{
12
//
以transitionName的名字為子Token命名
13
tokenName
=
transitionName;
14
}
else
{
15
//
如果已經(jīng)存在則以transitionName+2的方式命名
16
int
i
=
2
;
17
tokenName
=
transitionName
+
Integer.toString(i);
18
//
如果加2之后依然存在,開始循環(huán),直到父Token中不存在相同名稱的子Token
19
while
(parent.hasChild(tokenName))
{
20
i
++
;
21
tokenName
=
transitionName
+
Integer.toString(i);
22
}
23
}
24
}
else
{
25
//
如果transitionName為空,則判但父Token中是否有子Token,如果有則以parent.getChildren().size() + 1法命名,
26
//
如果沒有直接命名為1
27
int
size
=
(parent.getChildren()
!=
null
?
parent.getChildren().size()
+
1
:
1
);
28
tokenName
=
Integer.toString(size);
29
}
30
return
tokenName;
31
}
名字定好之后,F(xiàn)ork為每個離開轉(zhuǎn)向分別創(chuàng)建了一個子Token,加入一開始創(chuàng)建的forkedTokens中。最后開始循環(huán)列表,執(zhí)行Node的leave方法,并觸發(fā)Node-leave事件
iter
=
forkedTokens.iterator();
while
(iter.hasNext())
{
ForkedToken forkedToken
=
(ForkedToken) iter.next();
Token childToken
=
forkedToken.token;
String leavingTransitionName
=
forkedToken.leavingTransitionName;
ExecutionContext childExecutionContext
=
new
ExecutionContext(childToken);
if
(leavingTransitionName
!=
null
)
{
leave(childExecutionContext, leavingTransitionName);
}
else
{
leave(childExecutionContext);
}
}
看了這段代碼我們應(yīng)該明白:Fork的Node-leave事件是會執(zhí)行多遍的,具體要看產(chǎn)生的子Token的個數(shù).至于ForkedToken類,其實是Fork的一個內(nèi)被類,只起到一個普通Bean的作用.
到這里,F(xiàn)ork類的大體內(nèi)容我們已經(jīng)解讀完畢,但是還有一點要注意的地方:
add some way of blocking the current token here and disable that blocking when the join reactivates this token Then an exception can be thrown by in case someone tries to signal a token that is waiting in a fork.Suspend and resume can NOT be used for this since that will also suspend any related timers, tasks and messages...So a separate kind of blocking should be created for this.
文章原創(chuàng),轉(zhuǎn)載請注明出處!
posted on 2008-11-05 16:41
零全零美
閱讀(2116)
評論(0)
編輯
收藏
所屬分類:
jbpm
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關(guān)文章:
[原創(chuàng)]巧用System.getProperty()編譯現(xiàn)有工程的java文件
[原創(chuàng)]JBPM源碼解讀之:Join
[原創(chuàng)]JBPM實踐之:并發(fā)子流程的實現(xiàn)
JBPM實踐之:使用Fork中的Script實現(xiàn)多路路由選擇
[原創(chuàng)]JBPM源碼解讀之:Fork
JBPM實踐之:在流程圖上高亮顯示指定的任務(wù)節(jié)點
Copyright ©2025 零全零美 Powered By
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
国产精品色午夜免费视频
|
午夜免费福利视频
|
卡一卡二卡三在线入口免费
|
亚洲精品中文字幕无乱码
|
性xxxx视频免费播放直播
|
午夜亚洲国产理论秋霞
|
免费毛片在线看不用播放器
|
亚洲AV永久青草无码精品
|
香蕉成人免费看片视频app下载
|
亚洲爆乳精品无码一区二区三区
|
最新黄色免费网站
|
久久亚洲成a人片
|
在线免费观看国产
|
亚洲性色成人av天堂
|
91在线视频免费播放
|
国产AV无码专区亚洲AV麻豆丫
|
日韩特黄特色大片免费视频
|
国产亚洲视频在线观看
|
国产亚洲美女精品久久久2020
|
抽搐一进一出gif免费视频
|
久久青青草原亚洲AV无码麻豆
|
午夜老司机永久免费看片
|
亚洲日本人成中文字幕
|
国产免费人成在线视频
|
韩国免费a级作爱片无码
|
亚洲综合一区二区精品导航
|
精品久久久久久久久免费影院
|
亚洲av无码专区首页
|
国产偷窥女洗浴在线观看亚洲
|
怡红院免费全部视频在线视频
|
亚洲精品国产福利片
|
免费高清小黄站在线观看
|
一级一级一片免费高清
|
久久亚洲国产精品成人AV秋霞
|
99在线精品视频观看免费
|
国产成人综合亚洲一区
|
亚洲成亚洲乱码一二三四区软件
|
国产成人精品免费视频大
|
鲁啊鲁在线视频免费播放
|
亚洲av无码一区二区三区乱子伦
|
免费无码看av的网站
|