流程發(fā)送動作
發(fā)送動作是流程中的關鍵動作,程序或用戶通過觸發(fā)發(fā)送動作來進行流程的流轉(zhuǎn),對于人工干預的發(fā)送動作來說,通常會顯得很復雜,做過類似辦公系統(tǒng)的人都會體會到這點,發(fā)送為什么會變得復雜呢,首先發(fā)送是由多個步驟構成的,其次就是各個步驟都有一些用戶可通過配置來改變發(fā)送步驟的行為的點,在人工干預要求很強的發(fā)送動作中,就變得更為復雜了,來看看正常情況下發(fā)送動作的步驟以及其可配置點:
1、? 選擇下一環(huán)節(jié);
u?????? 配置為由用戶自行選擇環(huán)節(jié);
在這種情況下,用戶又可以配置為選擇一個環(huán)節(jié)或多個環(huán)節(jié),當用戶配置為僅選擇一個環(huán)節(jié)時,如該環(huán)節(jié)下可用的環(huán)節(jié)為多個時,則需提供給用戶選擇,如可用環(huán)節(jié)僅一個時,程序應自動選擇;當配置為選擇多個環(huán)節(jié)時,則由用戶自行選擇。
u?????? 配置為由程序決定下一環(huán)節(jié);
在這種情況下,用戶可配置為條件流轉(zhuǎn)、或分離以及與分離三種情況。條件流轉(zhuǎn)是指根據(jù)特定的條件來決定流向哪個環(huán)節(jié),如當資金大于 100w 小于 1000w 時需要流轉(zhuǎn)到環(huán)節(jié) A ,當大于 1000w 時需要流轉(zhuǎn)到環(huán)節(jié) B ;或分離以及與分離都僅適用于后續(xù)環(huán)節(jié)超過一個時,或分離指由程序隨機發(fā)送給后續(xù)的任一環(huán)節(jié),與分離指發(fā)送給后續(xù)的所有環(huán)節(jié)。
2、? 選擇環(huán)節(jié)參與者;
u?????? 配置為由用戶自行選擇參與者;
同樣,在這種情況下,用戶又可以配置為選擇一個或多個參與者,在環(huán)節(jié)可用的參與者僅為一個時,由程序自動選擇。
u?????? 配置為由程序決定環(huán)節(jié)參與者。
同樣,在這種情況下,用戶又可配置為條件選擇參與者、或選擇以及與選擇三種情況。
3、? 流轉(zhuǎn)流程到指定環(huán)節(jié)的指定參與者。
?由程序自行實現(xiàn)。
在這樣的整理下,可以看出流程的發(fā)送動作也不算太復雜,只是在實際的實現(xiàn)中往往會有各種各樣不夠好的實現(xiàn),個人覺得對于流程的發(fā)送動作首先要看成一個完整的事務來實現(xiàn),發(fā)送動作由各步驟來組成,各步驟中的失敗后都可自動或由用戶進行回滾操作,而各步驟的擴展配置點則可采用類似 Template Pattern 的方式或擴展點的方式來實現(xiàn),在這樣的設計下,發(fā)送動作具體怎么進行是可以通過配置來形成的,而不是通過代碼反復的 copy 或調(diào)用,一個選環(huán)節(jié)、由程序自動根據(jù)條件選擇參與者的發(fā)送動作可配置類似如下:
<action name=” 選環(huán)節(jié)但不選參與者 ”>
?????? <step ref=” 選環(huán)節(jié) ”>
????????????? <param name=”auto”>false</param>
?????? </step>
?????? <step ref=” 選參與者 ”>
????????????? <param name=”auto”>true</param>
????????????? <param name=“extend” ref="條件選擇參與者">
??????????????????? <conditions>
???????????????????????????<condition participant="roleA,roleB">
??????????????????????????????<value name="form.money" condition=">">10000</value>
??????????????????????????????<value name="form.money" condition="<">100000</value>
????????????????????????? </condition>
???????????????????????????<condition participant="roleC">
????????????????????????????? <value name="form.money" condition=">=">100000</value>
???????????????????????????</condition>
?????????????????? </conditions>
????????????? </param>
?????? </step>
?????? <step ref=” 流轉(zhuǎn) ”/>
</action>
而在 step 的配置文件中類似如下:
<step name=” 選環(huán)節(jié) ” class=”com.blogjava.bluedavy.workflow.SelectActivityStep”/>
<step name=” 選參與者 ” class=”com.blogjava.bluedavy.workflow.SelectParticipantStep”/>
<step name=” 流轉(zhuǎn) ” class=”com.blogjava.bluedavy.workflow.SendStep”/>
<extend name="條件選擇參與者" class="com.blogjava.bluedavy.workflow.SelectParticipantByConditionExtend"/>
在允許人工干預的發(fā)送動作中,要注意的是盡管發(fā)送動作是由多步驟來組成實現(xiàn)的,但基本上很難按照傳統(tǒng)的責任鏈的方式去實現(xiàn),這是因為流程發(fā)送動作的步驟是有界面中斷交互的,最佳的方式是采用責任鏈加
continuations
的支持,就可以很好的實現(xiàn)流程的發(fā)送動作。
在實際的流程發(fā)送動作中,還有更為復雜的情況,象抄送、傳閱辦理、跳轉(zhuǎn)、會簽等這些特殊類型的發(fā)送動作,實現(xiàn)起來就比上述的發(fā)送動作更為復雜,但其實現(xiàn)原理仍然類似上面所述。
posted on 2006-07-12 16:32 BlueDavy 閱讀(2326) 評論(0) 編輯 收藏 所屬分類: Workflow