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