Apache ODE 流程編譯過程解析

 

流程編譯過程包括了兩個步驟,一個是流程的部署過程,另一個是編譯。在BPEL流程設計完之後,要想使用該流程首先得將流程文件及相關WSDL文件拷貝到特定文件夾中,該文件夾爲所有部署流程的放置位置,這樣的實現,降低了流程部署的複雜性。引擎通過查看該文件夾來得知是否有新的流程加入到引擎中,如果發現該文件夾中有新的流程部署,則開始解析BPEL文件和相應的部署文件(deploy.xml),該文件對當前所要部署的流程基本信息進行描述,包括流程名稱、流程所引用到的WSDL文件等,在解析過程中根據BPEL規範對不同活動的定義來提取BPEL文件中的各個結構信息、變量信息,以此來構建一個在引擎內部交互的BPEL對象,該對象包含了所有BPEL流程相關信息,後續的所有運行操作再不需要其他文件的參與。在沒有錯誤之後,由持久化層將該流程信息進行存儲,等待客戶端調用。最後,還應該將該BPEL暴露爲Web服務,並且提供WSDL文件。



 在引擎啓動後,首先會根據引擎所在的容器環境,對流程部署文件夾進行配置,然後啓動部署輪詢器來每隔固定間隔輪詢檢查。部署輪詢器會首先檢查新加的流程文件夾中是否有deploy.xml文件,通過FileFilter來實現該功能,然後再爲新部署的流程創建一個標誌文件,表示該流程已經部署成功,這裏使用一個空文件來表示,例如對於ATM-process/這麼一個流程,將爲該流程創建一個ATM-process.deployed空文件表示其已經部署,然後再通過log4j[31]提供的FileWatchDog工具類來監控該文件夾,如果發現該文件內容有更新則對該流程進行重新部署。部署輪詢器還要負責刪除流程,如果用戶刪除了流程部署文件夾下的流程文件,則需要調用相應的部署工具類來移除該流程。

在檢測到有新的流程部署之後,引擎調用ProcessStoreImpl.deploy(File)來部署一個流程。在部署的過程中主要是解析BPEL文件的過程,這就需要對XML文件進行操作,在本項目我們採用Apache Xerces來操作XML文件,通過解析讀取BPEL定義文件,從中抽取相應信息,構建BPEL的對象模型,並最終通過序列化對象,將其信息保存爲二進制形式。這些功能是由DeploymentUnitDir類封裝了BpelC工具類來完成的,其中DeploymentUnitDir代表的是一個部署單元,對應到實際的文件系統就是/processes/文件夾下的某個流程文件夾,而核心功能的實現則通過BpelC類的compile(File bpelFile)方法來實現。在該方法中主要做了兩個工作,一是解析流程定義文件,利用Java反射機制生成對應的流程對象;二是利用上一步中生成的流程對象生成該流程所對應的編譯後的二進制文件。流程文件的解析可以通過導入相應的Schema文件來簡化解析過程,在取得對應的Document對象後便可以根據該Document的根節點的類型來判斷需要反射生成的對象類型,對象的構造過程是完全根據流程文檔的內容進行的(因爲Document對象完全表達了流程文件的內容),流程對象將會保存有該流程的屬性和所有其所包含的子元素。而該對象只是一箇中間值,通過該對象可以拿到流程的一些屬性值,然後再將流程相關的所有信息通過Java持久化機制保存成爲一個二進制文件,當然也有與該文件相對應的Java對象,該編譯後對象與上面介紹到的流程對象的不同是編譯後對象包括了流程對象,還有相關XSD文件,WSDL文件等內容。在流程部署後該編譯對象是常駐內存的,它保存有該流程的實例個數,流程的執行只要有該對象的參與便可以取得其他相關信息。而之所以需要序列化該編譯對象,是因爲引擎停止運行後重啓,需要加載已經部署成功的流程,這樣就可以反序列化該對象文件便可以重新加載運行了。



 用戶通過設計器設計完成流程之後,將流程設計文件交給引擎,而其中的編譯過程對於用戶來說是透明的,用戶希望得到的是可以調用的流程實例,BPEL流程最終展示給外界的還是以Web服務的方式進行的,也就是說用戶最終可以通過調用一個Web服務來啓動流程的執行。要想讓用戶使用流程,還需要流程編譯的最後一步,就是將該流程暴露爲Web服務,等待外部調用,新建Web服務的工作則由AXIS2模塊來負責完成。

流程部署過程中,一個流程的狀態不斷的在發生變化的,最先開始階段流程是未部署狀態,部署成功後是已部署,但還沒有激活,激活之後流程就可以等待用戶調用了,如果有流程實例生成,那麼該流程就是運行態了。針對這樣的特點,引入事件機制,根據流程在不同時期的不同狀態來觸發事件。這樣在流程部署成功後,觸發流程狀態轉換事件,而每一個狀態的不同肯定是有流程形式上、或者表現上的不同來體現的。而在流程從部署態轉換到激活狀態就是表現爲流程將自己以服務的方式暴露給外界,它通過流程配置信息、服務名稱、端口名稱等信息創建一個新的Web服務,同時將新創建的Web服務所包含的操作的消息接收器指定到具體的內部消息轉換器上,這樣在AXIS2接收到用戶的調用消息後纔會跟引擎連接起來,將消息傳遞進入引擎內部。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章