posts - 193,  comments - 520,  trackbacks - 0
           

          又是一年,坐在因為新年而顯得空曠的辦公室里,手邊是圖靈剛剛出版的一本訪談錄《編程人生》,翻看了幾頁,我想說的是:那不是我們的生活,幾歲就開始編程,十幾歲就有了自己的軟件公司,這種事情太過遙遠。我們的生活是這樣的:朝九晚五,經常加會班,會為了一個程序問題而抓狂,也會為了一個程序問題而狂喜,周末時候喜歡宅在家里,或者玩會游戲或者繼續編程,日益感到生活的壓力,曾經引以為豪的職業其實非常普通,為房子苦惱,依舊夢想通過技術創業。是的,這才是我們的生活,我們只是普通的程序員。


          那么,我該做點什么呢?是的,寫點什么吧。一直以來,我的夢想就是能夠寫自己的小說,高中時,在當地雜志和報紙上發表過幾篇文章,那時的目的很單純,就是想引起喜歡女生的注意;大學時,開始瘋狂的看小說,最喜歡的是余華,他的文字能讓我在合上全書時發出長長的一聲的感嘆;大三時,突然開始自己寫了篇中篇小說,給北京文學投稿,沒有回應,于是發表在了榕樹下;工作了,身邊充斥著的是厚厚薄薄的技術書籍,小說開始變得遙遠,但我依舊能夠時常記起那些溫暖過我的小說人物們;現在,我越來越發現,我們生活在一個很小說的年代,而現在的小說們,卻源自生活低于生活,在穿越在科幻,我想,這正是個寫小說的好年代,你不需要加工,生活本來就是小說,荒誕而黑色。


          于是,就有了這篇《張小慶,在路上》的小說,計劃分為四卷,分別是:開始、奮斗、迷茫和平淡,它講述了一個普通程序員的生活,一個處于社會底層的小人物,他的喜怒哀樂,他的生活。


          為什么要寫這篇小說,理由很多,但我想最重要的是:喜歡!我不想在我老去的時候,對我孫子說,知道嗎,你爺爺年輕的時候文章寫得很好,如果那時寫小說去了,一定是個大作家。這話聽起來就很虛偽,給人一種生不逢時的感覺,但是去他媽的生不逢時,與其那時后悔,不如現在開始,來吧,在路上的張小慶。

           

          posted @ 2011-02-28 22:28 ronghao 閱讀(1624) | 評論 (6)編輯 收藏
               摘要:   閱讀全文
          posted @ 2010-09-19 22:03 ronghao 閱讀(2289) | 評論 (4)編輯 收藏

          項目上線,有時間總結一下當前的項目,對自己而言,一直是一個學習的過程。本篇總結我們的測試實踐。本文分5部分,分別是:項目背景、系統架構與模塊劃分、我們的測試實踐、自動化測試在項目中的價值與對自動化測試的進一步思考。

          一、項目背景
          所有對項目的介紹一定是從客戶開始。
          客戶:我們的客戶是一家全球領先的時尚內容提供商,通過遍布全球的員工,客戶每天獲取大量關于時裝發布、產品設計、街邊流行、城市熱點等信息,這些信息的絕大部分以圖片的形式上傳到公司服務器,然后由專職編輯對這些圖片進行整理和歸類(打標簽),最后再由設計人員根據這些信息書寫分析報表。
          關鍵內容:分類細致的海量高清圖片和具有前瞻性的分析報表。
          商業模式:網站,行業內用戶訂閱-付費。
          客戶面臨的問題:同質化競爭、客戶流失。
          新系統的關鍵詞:CMS、更精確的內容分類、更好的全文檢索、更好的用戶體驗(更有表現力的內容展現)、更快的內容發布。

          二、系統架構與模塊劃分
          1、REST的架構風格
          系統采用了Sling作為WEB框架,JCR作為了底層內容存儲框架。
          系統的特點:
          URI唯一標識資源
          通過URI能夠直接映射到JCR節點,例如http://localhost:80/content/section/news.html能夠映射到JCR里的/content/section/news節點

          GET/POST/DELETE標準方法對資源進行操作
          支持標準方法對資源的直接操作

          資源的多重表述
          同一資源可以存在多種表述形式,例如http://localhost:80/content/section/news.html展現網頁,

          http://localhost:80/content/section/news.json展現資源信息的JSON描述,
          http://localhost:80/content/section/news.pdf展現網頁的PDF。

          服務器端的無狀態
          通過JS獲取當前用戶信息并緩存在客戶端。

          2、系統分層
          系統分為四層:JS、Servlet、Domain Model和JCR。
          因為JCR提供了一套節點模型,所以Domain Model是在節點模型上的行為增強,例如所有對圖片節點的操作我們封裝在Asset領域模型里。
          系統分層

          3、程序劃分
          程序分為兩個大的模塊:Migration和Bundles。為什么叫Bundles?因為Sling使用了OSGI框架Felix。
          Migration負責導入客戶的遺留數據到新系統。之前客戶的CMS運行已有10多年的時間,積累有大量數據。主要是各種類型的報表和圖片。
          Bundles實現系統功能。主要包括了定義報表模板、定義報表各種所見即所得的展現組件、實現對圖片的管理、搜索(包括基于圖片的可視化搜索)和其他七七八八。

          三、測試實踐
          1、Migration的測試
            自動化測試

          對Migration,我們采用了TDD的方式。
          輸入是客戶實際提供的xml文件,輸出是JCR里的節點。測試環境的搭建主要是在本地建立起Jackrabbit實例。我們的工作方式是這樣:每天早上領到一張migration故事卡,然后先寫一個xml到jcr節點的集成測試描述出該類型報表的功能需求,接下來就是讓這個測試通過。經過開始階段的熟悉過程,我們的速度保持在一對Pair一天一種報表類型的導入。

             手工測試
          將xml文件內容正常解析并導入JCR只是第一步,第二步我們需要在Bundles里為該類型的報表編寫模板使之正常展現。由于涉及到報表樣式,這個測試我們采用手工測試,這個工作也是QA工作的重要一部分。
          在最開始的開發中,我們沒有導入所有報表數據進行測試。這帶來了問題,由于客戶遺留數據跨越10多年,各種數據形式都可能存在(特別是04年以前數據,給UI帶來了很大挑戰),而最開始的開發中,我們只是使用了部分數據(09、10年數據)進行測試,這個導致了建立UAT環境時程序的很多返工以及QA的測試壓力。

          2、Bundles的測試
          自動化測試

          對領域模型,我們采用了TDD的方式進行單元測試;在本地Jackrabbit實例里建立數據,領域模型封裝數據測試行為。
          對servlet,我們采用了TDD的方式進行集成測試(同時測試了servlet和領域模型),在測試中對request和response進行mock;
          對JS,我們使用數據驅動的selenium功能測試進行覆蓋。

          測試覆蓋

          我們最后的自動化測試結構:
          測試的分層

          手工測試
          手工測試內容主要是功能測試。
          自動化測試價值低的部分我們采用手工測試,這部分內容包括報表模板,相對獨立,內容不多,一次測試處處通過;
          自動化測試成本高的部分我們采用手工測試,這部分內容包括報表展現組件的編輯功能,因為采用了Ext JS,所以自動化測試困難;
          無法自動化的測試:報表在線生成PDF,報表樣式,WEBDEV批量上傳圖片等;

          我們與QA的約定:
          每完成一個用戶故事,我們會與QA、BA一起mini showcase;
          QA驗收完成后編寫功能測試用例;
          我們對QA編寫的功能測試用例進行自動化,共同維護一個功能測試列表;
          對于不能自動化或自動化價值不高的測試用例QA繼續使用手工測試。

          四、我們感受到的自動化測試價值
          1、通過自動化功能測試,我們使得需求對客戶可視化;
          2、QA的回歸測試成本降低,盡管目前頻繁的向客戶實際使用環境部署,但QA每次部署只需要做一些簡單的冒煙測試;
          3、測試即需求,這點在TDD的開發過程中感覺非常明顯,今天開發的目的就是使這個測試通過,避免了頻繁部署到應用中進行測試,最快的電梯不是速度最快的電梯,而是中間停的樓層最少的電梯;
          4、與持續集成一起,及時反饋。這點在進行JS代碼編寫時,心理上都非常依賴于selenium測試,對于沒有測試覆蓋的地方,沒有安全感;
          5、足夠的單元、集成測試保證了頻繁重構,沒有人愿意引入BUG,沒有足夠的測試,沒人愿意重構;
          6、測試即文檔,良好的測試和命名,使得新加入的成員非常容易理解當前代碼的功能。

          五、思考和討論
          1、自動化功能測試做到多少才合適?
          當然是越多越合適,問題在于自動化功能測試成本要大大高于單元測試和集成測試,這些成本反映在測試環境的搭建、數據的準備,需要準備其他很多關聯數據例如用戶信息和權限信息、自動化功能測試的運行時間長、穩定性(隨機成功/失?。⒕帉懙鹊龋枰獧嗪獬杀九c收益。
          個人認為,自動化功能測試需要考慮的著重點包括:頁面是否包含大量功能交互性JS(與展現性JS相對)?當前功能是否與其他功能共享一些代碼?即獨立性,獨立性越低越需要著重覆蓋(這里又涉及到另外一個問題,即從各個模塊里重構出共用代碼是否總是合適?)。QA每次冒煙測試時是否需要重復回歸(重復回歸次數越多,自動化越有價值)?經常失敗的測試一定比不失敗的測試價值更高?或者從未失敗過的測試就沒有價值?

          2、單元測試?功能單元測試?
          TDD的測試粒度多大才合適?從我個人而言,幾乎天然的反對mock,為了滿足測試覆蓋率的追求,強制將兩個聯系很緊密的類分開,做出各式各樣mock,這真讓人氣餒;stub也不是什么好東西,在一個曾經的spring項目里,在測試目錄里,一堆一堆的測試xml配置文件讓人有種嘔吐的感覺。那就做集成測試吧,兩個類關系很好,那么就整體測試它們的輸入和輸出,看起來很不錯,功能實現了,測試也沒多寫,也不用準備太多其他東西,但是打開實現代碼,你就發現那個丑陋,到處是復制和粘貼,是啊,不管黑貓白貓抓住老鼠就是好貓,只關注了當前結果,完全失去了TDD驅動簡單設計的好處。

          3、測試的重點是測試用例的設計,它反映出對需求的理解
          那么結論就很明顯,我們如果連需求就沒有理解,如何進行實現,所以測試驅動是很自然的。

          posted @ 2010-06-16 21:13 ronghao 閱讀(2401) | 評論 (0)編輯 收藏


          正如語言是人之間的溝通方式一樣,數據是IT系統之間的溝通方式,語言之間的溝通總是最有效的,數據交互卻未必,因為IT系統里的數據除了讓計算機理解外重要的是還需要人理解。在這篇文章里,我們將討論工作流系統里的數據,從數據角度分析工作流數據的分類以及不同的應用場景。

           

          一、工作流系統的應用場景

          在正式開始對工作流數據的討論之前,首先對工作流系統的應用場景進行討論是必要的,因為工作流數據脫離不開工作流系統這個大的上下文。目前,工作流系統的應用主要有兩種方式:

          1、    將工作流系統嵌入到業務系統中使用。此時工作流系統作為內部組件對業務系統進行流程邏輯的橫切。試想一個需要多人處理的電力繳費流程,在引入工作流系統之前,我們需要為每個業務表單設置一個狀態位,以此來進行業務處理狀態的跟蹤。如果流程固定,那么這樣做并沒有什么不好,例如財務軟件、海關報關軟件等,它們的流程雖然復雜但是不常改變,此時就沒有必要引入工作流系統。但是對于另外一些情況,例如制造業的訂單處理、庫存管理、政府的協同辦公等,流程經常需要定制修改,此時如果繼續由業務系統自己處理流程邏輯那么成本將會很高。

          2、    使用工作流系統進行業務系統的集成。在上規模的企業里,很多流程會涉及到不同的業務功能,例如報價、訂單審核、資產核準、績效評估等,這些流程經常會跨越不同的部門和業務系統。因為不同企業都有自己所采用的業務系統、組織機構以及最佳的業務協作方法,所以這些流程基本上也隨企業而異。工作流系統此時扮演的就是集成角色,由其通過定制流程將這些業務系統撮合起來,實現企業內各部門、客戶間的信息流動和協作。

          在第一種應用場景下,工作流系統作為業務系統的內部橫切組件出現,作為橫切組件,工作流數據僅僅包括與流程邏輯相關的數據以及其他必需數據,這些數據包括工作流控制數據、工作流相關數據以及需要通過流程傳遞的業務數據。

          在第二種應用場景下,由于不同業務系統之間的數據傳遞很大程度上依靠工作流系統,所以這些數據被封裝為SDO在不同WEB服務間傳遞,需要注意的是,這些數據并不在工作流系統中存儲。

                  在下面的工作流數據分類中,我們將詳細分類這些工作流數據。

           

          二、工作流數據的分類

          提到工作流數據,就不得不提業務數據。作為最直接的區分,我們將存儲于業務系統中的數據稱為業務數據,將存儲于工作流系統中的數據稱為工作流數據。根據WFMC定義,我們將工作流數據分為工作流控制數據和工作流相關數據。

          1、  工作流控制數據。指被工作流系統管理的系統數據,這些數據包括了與流程實例和任務實例相關的執行數據,例如流程實例的狀態、執行時間等信息、任務實例的執行者、執行時間、狀態、緊急程度等。

          2、  工作流相關數據。指與業務流程相關的數據。工作流相關數據又具體分為3種:

          ·         影響流程實例執行的業務數據。在WFMC中,這個數據被描述為:工作流系統通過該數據來確定流程實例的流轉條件,并選擇下一個將執行的任務,這些數據可以被業務系統訪問并修改。例如報銷流程中的“報銷金額”,這個數據會決定該流程的審批路徑;再例如為任務設置的超時時間,這個數據會觸發任務的取消。實質上這些數據就是工作流系統需要依賴于進行流程流轉的業務數據。

          ·         契合業務的關聯數據。指工作流系統與業務系統進行關聯的數據,例如特定于WEB系統,工作流系統會在每個流程實例里保持有導航至對應業務表單的URL。

          ·         傳遞作用的業務數據。當流程跨越多個業務模塊時,需要在模塊間傳遞數據,此時會利用工作流系統進行傳遞,會在工作流系統里暫時存儲這些業務數據。

          那么,工作流數據有哪些應用場景呢?

           

          三、工作流數據與業務上下文

          工作流數據最重要的職責之一就是為業務系統的不同應用場景建立起與之對應的業務上下文。

          什么是業務上下文?

          我們知道,IT系統是對企業現實業務的映射。在一個翻譯公司的典型業務場景中,校對人員對翻譯人員提交的翻譯文檔進行審校,此時,校對人員持有翻譯人員翻譯后的文檔,他需要對該文檔進行檢查,產生新的審校文檔并反饋翻譯人員的翻譯質量。那么,映射到IT系統里,校對人員的任務通常對應于一張需要處理的業務表單,業務表單里會展現他進行當前工作所需要的數據:翻譯文檔、翻譯人員信息、該校對工作的緊急程度等,另外,在這張表單里,他所能進行的操作也根據他此時的職責作出了行為限定:例如他可以上傳新的校對后的文檔,但是不能刪除已有的翻譯文檔等。如下圖1所示,業務表單實質上反映的是此刻我們能獲取哪些數據以及能夠如何處理這些數據,我們把它稱之為業務上下文,可以看到,在IT系統里,業務上下文實質上等于數據加上行為。

          企業業務由一系列相互關聯的業務場景組成,這些業務場景對應于IT系統里的業務上下文,而業務上下文的本質則是數據加上行為。數據和行為的不同決定了業務上下文的差別。這與現實中的工作相符,人們根據獲取/處理信息的不同,擔負不同的職責。 


           1與應用場景對應的業務上下文

          工作流數據如何建立業務上下文呢?看一個簡單的例子。

          在實際應用工作流系統進行開發時,我們經常會碰到這樣的問題:同一流程中的不同任務對業務數據擁有不同的權限,如下圖6-9所示。



           6?9與流程相關的業務數據權限

          上圖中,在執行請假申請任務時,申請者可以編輯請假人、天數和原因3個字段;而到審批任務時,審批者增加了一個可編輯的審批意見字段,但其余3個字段變化為只讀字段。我們將這類問題統稱為與流程相關的業務數據權限控制。

          產生這類問題的原因是什么呢?原因就在于在一個業務流程里,不同的任務具有不同的業務上下文。如下圖6-10所示,不同的任務展現不同的數據,并具有不同的行為。


           6?10任務與業務上下文

          IT系統的設計實現中,數據的建模是通過領域模型實現的。在工作流系統的嵌入式應用中,流程實例即是通過與領域模型相關聯實現與業務契合的。那么,圖6-10可以進一步泛化為圖6-11,流程中任務通過獲取領域模型不同的部分實現業務上下文的界定。


           6?11領域模型與業務上下文

          在大部分的業務流程建模中,一個流程模型只與一個領域模型關聯。

          那么,回到最初的問題上,如何處理此類權限問題呢?答案非常明了:由領域模型實現對業務上下文的切分,工作流系統通過契合業務的關聯數據與業務上下文掛接,保持工作流系統的單一職責。


           6?12流程相關的業務數據權限控制

          如上圖6-12所示,我們在業務系統里引入業務權限角色的概念,通過該角色隔離開工作流系統與業務數據權限,即我們認為業務數據權限的管理屬于業務系統范圍(由業務系統具體實現),更進一步,我們認為其屬于領域模型的職責范圍。在定義好業務系統的權限角色后,我們通過任務級別的工作流變量將流程中的具體任務與業務權限角色綁定,這樣就實現了流程任務與業務數據權限的掛接。

          在上面的例子中,我們看到的是利用關聯業務的工作流數據界定任務級別的業務上下文,這是一種最簡單的工作流數據應用場景。在不同應用中,我們可以看到,工作流數據一個重要的職責就是為業務流程里的任務/流程建立業務上下文,實現數據的聚合。在簡單的應用場景里,對一個流程實例而言,這些數據可能只對應于一個領域模型;對流程實例里的一個任務實例而言,這些數據對應于領域模型的一個切面。復雜一些的情況,業務上下文需要跨越多個領域模型甚至多個業務系統,這時我們可以看到,通過工作流系統能夠顯著降低業務系統建模的復雜性,因為這些數據聚合工作可以有效分派給工作流系統承擔。同時,我們需要保持工作流系統的單一職責,工作流系統只保存與業務數據進行關聯的關聯數據、必需的業務傳遞數據以及自身的執行數據。


           6?29跨系統的業務上下文

           

           

          四、工作流數據與數據分析

          工作流數據的第2個應用場景是對業務流程執行進行數據分析,這部分的數據主要是工作流控制數據。這一部分正受到越來越多的重視,是未來工作流系統的發展方向。


           6?48外部環境從流程實例拉數據進行分析

           

          這里有兩個典型的應用例子:

          例子1在對報銷流程進行分析時,我們發現大部分的報銷金額都低于500元,然而這些報銷流程卻都要經過很多環節,在與客戶確認后,我們將低于500元的報銷限定于部門內部審批即可,這樣對個人來說大大加快了報銷過程,對公司來說則省下了很多的辦公成本。

          例子2,在制造流程里,很重要的一點是需要控制流程的節拍時間,即流程里各個任務的完成時間要一致,如果有一項任務的時間多于其他任務,那么很快就會形成瓶頸,造成在制品的大量積壓,前續的任務完成很快,中間忙死,后續任務執行者卻無事可做,更重要的是,不能對客戶進行快速交付。

           

           

          五、工作流數據與流程路由

          最后一種應用場景非常常見,這部分數據即影響流程實例執行的業務數據,直接上圖:


          這部分影響路由的一定是業務數據,它們保存到工作流系統里對流程路由產生影響。這種影響不限于任務的選擇,還包括的任務的執行條件、任務的完成條件、基于數據的任務觸發等。

           

          六、工作流數據小結

          總結一下,作為區分,我們將存儲于業務系統中的數據稱為業務數據,將存儲于工作流系統中的數據稱為工作流數據。

          工作流數據分為兩種:工作流控制數據和工作流相關數據。其中工作流相關數據又分為3種:影響流程實例執行的業務數據、契合業務的關聯數據和傳遞作用的業務數據。

          工作流數據的應用場景:為流程/任務建立業務上下文,這部分數據主要是契合業務的關聯數據和傳遞作用的業務數據,這是工作流數據最重要的職責之一;數據分析,這部分數據主要是工作流控制數據,這是未來工作流的發展方向;影響流程路由,這部分數據人如其名,是影響流程實例執行的業務數據。

          實際應用中,我們一定要保持工作流系統的單一職責,例如劃分任務權限這個需求,一定需要業務系統自行實現權限的界定,工作流數據僅僅進行掛接。

           

           


          posted @ 2010-05-23 22:17 ronghao 閱讀(2511) | 評論 (1)編輯 收藏

          PDF噩夢

          在之前的一段時間里,只要一提起PDF,我就會頭暈,然后是頭疼,最后是頭大,總之是和頭相關。需求很簡單:為所有報表提供在線生成PDF版本的功能,這樣網站用戶在瀏覽報表時就可以下載離線瀏覽。對不住了,開源軟件,我不得不說,慎用開源軟件,慎用!痛苦的查找論壇、痛苦的翻看源碼,最后,在支付了200歐后,痛苦消失了,我們購買了商業軟件,200歐兼容了更多的網頁結構,200歐具有更快的速度,200歐帶有一年的技術支持,最最重要的是,200歐,客戶出的。

          這不是這里的關鍵,問題是,200歐后,我遇上了新麻煩:報表的PDF版本樣式不正確,不正確的原因是圖片下方的文字將圖片的排列樣式弄亂了(圖片大小不規則,字數不規則)。在網頁中,DOM渲染完畢后,我們使用JavaScript來進行圖片與文字高度的重計算,但在PDF中,我們束手無策。

          我問BA,可以容忍部分圖片排列不整齊否?不出所料。

          懷有僥幸,我繼續問BA,可以容忍部分文字丟失否?BA說,不可以。意料之中。于是找到徐昊。

          徐昊問BA,這些說明文字對客戶如此重要嗎?

          BA說,是的。

          徐昊說,為什么?它主要有哪些內容?

          BA說,有標題,簡單說明以及圖片的版權信息,最重要的就是版權信息,一定不能丟失。

          徐昊說,能不能這么說,其實對客戶最關心的是版權信息。

          BA說,是的。

          于是問題解決。解決方案是:我們給文字定高,同時將文字縮小以容納最可能多的字數,這樣網站用戶在PDF里看到的圖片重新恢復了整齊,盡管看不太清圖片說明文字,但是用戶真正關心的是圖片,誰關心哪些無處不在的版權信息呢?你可能會說了,看不清版權信息怎么行?幸好,你問的不是,版權信息有那么重要嗎?;卮鹗?,這里是PDF,移動你的鼠標到Zoom,點擊下拉框,點擊150%以上的選項,然后,你會驚訝的發現,那些該死的版權信息到處都是。

          BA的職責是幫客戶發現的問題,開發人員的職責是解決問題,QA的職責是校驗最終的實現是否能夠解決客戶的問題。具體到一個用戶故事上,就是BA編寫用戶故事,DEV編碼開發,QA驗收用戶故事,這是三個任務,很明顯,這三個任務有一個非常重要的共享信息,這個信息就是用戶故事所要實現的客戶價值(即幫客戶解決的問題)。圍繞著客戶價值,每次迭代開始前,團隊都會進行迭代計劃會議,所有成員會跟隨BA逐一審核各個用戶故事;圍繞著客戶價值,開發人員開發中隨時可以和BA進行溝通,就設計問題進行討論;圍繞著客戶價值,開發人員每開發完成一個故事,BA、開發人員和QA就會在一起進行一個微型 ShowCase,在期間討論用戶故事的實現是否實現了客戶價值,大家對用戶故事的理解是否一致。

          那么,在相關的任務之間需要能夠定義變量,這些變量數據能夠在這些任務間共享。

           

          描述

          一定的任務范圍能夠定義變量,在一個流程實例里,該范圍所包含的任務實例能夠使用該變量。


          6-4任務范圍級別的數據可見性

          如圖6-4所示,我們劃定了一個任務范圍,該范圍包含了任務A、任務B和任務C,同時,我們在該任務范圍內定義了一個變量M,那么,在一個流程實例里,只有任務A、BC的實例在運行期能夠使用該變量,任務DE的實例都不能訪問,不可見。

           

          可以看到任務范圍和塊任務在概念上比較相似,都是包含一系列的子任務,它們之間的差別在于:塊任務一般具有比較獨立的執行上下文和業務語義,而任務范圍則是對具有相同執行上下文的任務的一種分組。

          在工作流系統里,對流程任務進行分組的好處在于:可以為特定的一組任務綁定數變量、異常處理器和補償動作。例如在圖6-4中,如果任務A、BC中的任一實例執行失敗,那么我們就認為整個任務區域執行失敗,將統一執行一個業務補償行為,同時,這些任務共享一個異常處理器。

          實現

          jBPM4里,流程定義模型相比jBPM3最大的變化即是引入了任務嵌套的概念,一個任務能夠包含多個其他任務,這里的父任務即可充當任務范圍的定義。jBPM4針對這種嵌套的任務建立了一套處理機制,總的來說就是建立任務運行期的嵌套關系,查找變量時首先會在任務級別進行查找,如果找不到,則會依次向上查找父任務實例,直至流程實例級別變量,同時,父任務可以統一綁定異常處理器和事件動作。在后續jBPM4的章節,我們將會詳細分析該機制的實現細節。

          posted @ 2010-03-22 22:26 ronghao 閱讀(1625) | 評論 (0)編輯 收藏
          僅列出標題
          共39頁: First 上一頁 6 7 8 9 10 11 12 13 14 下一頁 Last 
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          關注工作流和企業業務流程改進?,F就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

          常用鏈接

          留言簿(38)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          常去的網站

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 顺平县| 南部县| 东乌| 东明县| 桦甸市| 富民县| 年辖:市辖区| 普宁市| 麟游县| 许昌县| 阳朔县| 壤塘县| 荣成市| 郑州市| 苏尼特右旗| 同仁县| 遂溪县| 广东省| 泰兴市| 南投市| 营山县| 阿尔山市| 宿迁市| 满城县| 济南市| 湟源县| 平邑县| 思茅市| 西青区| 淮北市| 大竹县| 沙湾县| 会昌县| 祁阳县| 阜平县| 东丽区| 神池县| 高邑县| 凌海市| 讷河市| 洮南市|