經過前面幾節的描述,我們基本上讓第一個工作流運行起來了,但是很多人肯定都雲裏霧裏的,配置文件爲什麼要這麼些,doAction之流到底有什麼用,有這些疑問在正常不過了,初次接觸肯定會遇到諸如此類的問題,或許更有甚者,沒關係,只要你有耐心閱讀,那麼我也會耐心的去寫(誰怕誰啊!)
1、工作流程
我們爲什麼要定義helloworld.xml那樣的文件,先來說說他所代表的意思吧,看看下面的這張活動圖,然後我們在對照着進行解釋。
2、詳細解釋
2.1、初始化節點
回顧一下helloworld.xml文件吧,再對照上面的狀態圖,其中initial-actions節點中的action代表需要初始化的動作,當一個工作流調用init方法的時候,其中inital-actions中的action將會被執行解析。
<initial-actions>
<action id="100" name="Start Workflow">
<results>
<unconditional-result old-status="Finished" status="Underway" step="1"/>
</results>
</action>
</initial-actions>
上面定義了一個action,並且是在initial時被執行的,在osworkflow中有一個規定,必須至少有一個action子節點在initial-actions中,因爲每一個流程都必須進行初始化操作。初始化的時候或許會發生很多悽美的故事,再來說說action,我們定義了他的id是100,它代表action的序列號,而name屬性則可以隨便起,但是建議起一個能知其意的名字。
osworkflow工作流的流轉是需要靠結果進行流轉的,因此在action中我們定義了一個results節點,爲什麼是複數呢?意味着可以有多個result結果,但是必須有一個無條件的結果unconditional-result節點,當有條件的結果都不滿足的時候或者沒有有條件的結果的時候,無條件結果就會默認被執行(有條件結果集,我們會在後文中講解),再來看看step屬性(old-status和status屬性,在後文中介紹),他表示執行完初始化之後,工作流流轉到那個步驟,好了再來對照一下剛纔的測試代碼,其中是不是有一個init方法。
long id = wf.initialize("first", 100, Collections.EMPTY_MAP);
他就代表在workflow初始化的時候執行action中規定的動作。2.2、步驟節點
步驟節點是osworkflow中最重要的概念之一,他是工作流的靈魂所在,對照着上面的狀態圖以及我們的配置文件,我們來看一下,在osworkflow中,步驟代表一下個流程的流轉節點,在osworkflow中至少需要有一個step節點。
<steps>
<step id="1" name="HELLOWORLD1">
<actions>
<action id="1" name="helloWorld action1">
<results>
<unconditional-result old-status="Finished"
status="UnderWay" step="2" />
</results>
</action>
</actions>
</step>
<step id="2" name="HELLOWORLD2">
<actions>
<action id="2" name="helloWorld action2" finish="true">
<results>
<unconditional-result old-status="Finished"
status="UnderWay" step="-1" />
</results>
</action>
</actions>
</step>
</steps>
當初始化完成之後,step指到了step=1這個位置,也就是說目前可執行的step只有1,因此我們運行了下面的代碼
wf.doAction(id, 1, Collections.EMPTY_MAP);
當執行完step1的action1之後,result節點有指向了step2節點,我們顯示的調用了
wf.doAction(id, 2, Collections.EMPTY_MAP);