<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 26,comments - 77,trackbacks - 0
         摘要: 9月1號(hào)4.1發(fā)布了,上周將jBPM4.1的用戶手冊(cè)并提供給大家下載了,請(qǐng)見博客:http://www.tkk7.com/kaysurf168/archive/2009/09/10/294523.html,現(xiàn)在將jBPM4.1的中文開發(fā)指南也提供給大家下載,希望降低大家學(xué)習(xí)jbpm4的難度。有翻譯不當(dāng)?shù)牡胤竭€請(qǐng)指出。
      閱讀全文
    posted @ 2009-09-17 09:52 卡宴 閱讀(3321) | 評(píng)論 (10)編輯 收藏
         摘要: 這篇文章主要講述jBPM4.1的新特性和翻譯用戶手冊(cè)的內(nèi)容更新下載。  閱讀全文
    posted @ 2009-09-10 01:30 卡宴 閱讀(5435) | 評(píng)論 (2)編輯 收藏
         摘要: 《每天一課,jBPM4》視頻教程今天推出基本應(yīng)用系列——第五課,第五課主要講了jBPM4的流程追蹤。從下一課開始,我們將進(jìn)入高級(jí)應(yīng)用系列,主要是整合Spring+Hibernate+Struts2+jBPM4,以這些框架為基礎(chǔ)實(shí)現(xiàn)報(bào)銷流程。  閱讀全文
    posted @ 2009-09-03 11:09 卡宴 閱讀(1394) | 評(píng)論 (0)編輯 收藏
         摘要: 《每天一課,jBPM4》視頻教程今天推出基本應(yīng)用系列——第四課,第四課主要講了jBPM4的監(jiān)聽事件,jBPM4使用了Oberservable模式實(shí)現(xiàn)的事件監(jiān)聽。  閱讀全文
    posted @ 2009-08-28 14:36 卡宴 閱讀(986) | 評(píng)論 (0)編輯 收藏
         摘要: 這一課的內(nèi)容比較多,除了對(duì)jBPM4的身份認(rèn)證的管理的進(jìn)行講解之外,還講述了jBPM4現(xiàn)在的身份認(rèn)證還存在的一些功能缺陷和解決方法。  閱讀全文
    posted @ 2009-08-24 00:16 卡宴 閱讀(1258) | 評(píng)論 (0)編輯 收藏
         摘要: 經(jīng)常有人問我,jBPM4視頻教程到底有多少課,能講到什么程度?這里我就放出jBPM4視頻教程系列的初期規(guī)劃,同時(shí)我們今天還推出了jBPM4視頻教程應(yīng)用系列的第二課。并提供了我們現(xiàn)有視頻教程的觀看和下載鏈接。  閱讀全文
    posted @ 2009-08-19 08:47 卡宴 閱讀(1363) | 評(píng)論 (2)編輯 收藏
         摘要: 第一次使用工作流做項(xiàng)目或產(chǎn)品,遇到最簡(jiǎn)單最常見的需求就是分配任務(wù),待辦任務(wù)列表以及一些簡(jiǎn)單的流向判斷,這是基本所有的流程都要實(shí)現(xiàn)的,而我們這一課的內(nèi)容主要就是教大家在一個(gè)簡(jiǎn)單的業(yè)務(wù)流程里實(shí)現(xiàn)這些功能。  閱讀全文
    posted @ 2009-08-13 22:13 卡宴 閱讀(1275) | 評(píng)論 (1)編輯 收藏
         摘要: 《每天一課,jBPM4》視頻教程今天推出基本應(yīng)用系列——第一課,這個(gè)系列主要是以請(qǐng)假流程為例,請(qǐng)假流程作為OA中的一個(gè)經(jīng)典案例,覆蓋了多種流程特性,同時(shí)又兼具易讀性。主要內(nèi)容是執(zhí)行請(qǐng)假流程,實(shí)現(xiàn)流程駁回,用戶權(quán)限,任務(wù)與表單綁定以及流程追蹤等功能。  閱讀全文
    posted @ 2009-08-11 23:34 卡宴 閱讀(1529) | 評(píng)論 (5)編輯 收藏
         摘要: 這一課主要是講解流程實(shí)例的管理和流程活動(dòng)的分類介紹,這一課的視頻也是入門系列的最后一課,因?yàn)榈竭@一課為止我們就能讓大家入門jBPM4了,對(duì)于jBPM4的一些簡(jiǎn)單應(yīng)用已經(jīng)沒有問題了。從下一課開始,我們將進(jìn)入jBPM4系列視頻教程的基本應(yīng)用系列,正式開始接觸真正的業(yè)務(wù)場(chǎng)景的用例。  閱讀全文
    posted @ 2009-08-06 09:35 卡宴 閱讀(1364) | 評(píng)論 (2)編輯 收藏
         摘要: 《每天一課,jBPM4》視頻教程今天推出第二課,主要內(nèi)容是在web工程里應(yīng)用jBPM4。  閱讀全文
    posted @ 2009-08-03 09:41 卡宴 閱讀(2111) | 評(píng)論 (5)編輯 收藏
         摘要: 隨著jBPM4.0GA版本的發(fā)布,使用jBPM4的人也開始多起來(lái),雖然我們已經(jīng)翻譯了jBPM-4的用戶手冊(cè)和開發(fā)指南,但jBPM4的官方文檔內(nèi)容還是不夠全面,雖然理論知識(shí)比較豐富,但是缺少實(shí)踐教授內(nèi)容。我們推出的《每天一課,jBPM4》是jBPM4第一份系列視頻教程,手把手教您學(xué)會(huì)jBPM4,并將jBPM4應(yīng)用在工作流管理平臺(tái)中,同時(shí)我們還會(huì)提供視頻課程里的源代碼。  閱讀全文
    posted @ 2009-07-29 18:04 卡宴 閱讀(3191) | 評(píng)論 (7)編輯 收藏
         摘要: 這2天我們忙著做了下jBPM4和Spring Security的專題頁(yè)面,提供了不少關(guān)于jBPM4和Spring Security的技術(shù)資料和示例。  閱讀全文
    posted @ 2009-07-28 14:02 卡宴 閱讀(1706) | 評(píng)論 (4)編輯 收藏
         摘要: 在oa里我們實(shí)現(xiàn)一套權(quán)限管理,包括資源管理、角色管理、用戶管理、菜單管理以及組織機(jī)構(gòu)管理,整套權(quán)限采用的是RBAC的模型。下面給大家分享下效果,同時(shí)也提供源碼下載,希望大家多提建議。  閱讀全文
    posted @ 2009-07-22 11:56 卡宴 閱讀(2549) | 評(píng)論 (6)編輯 收藏
         摘要: 鑒于各位都非常期待PDF的版本,我便把用戶指南提供給大家下載,希望大家能夠多多反饋,這樣才能提高我們的翻譯質(zhì)量,對(duì)大家更是有好處。開發(fā)指南的內(nèi)容更豐富些,如果有感興趣幫忙校稿的朋友可以聯(lián)系我們O(∩_∩)O哈哈~  閱讀全文
    posted @ 2009-07-15 01:14 卡宴 閱讀(1962) | 評(píng)論 (10)編輯 收藏

    開發(fā)文檔更新到了jBPM4的GA版本,這次開發(fā)文檔變更非常大,添加了好幾章,并且原來(lái)的部分章節(jié)也改了名字,具體細(xì)節(jié)可以查看修改日志。不過(guò)架構(gòu)那章更新的并不多,和jBPM4實(shí)際的架構(gòu)還有些區(qū)別,所以這部分大家最好看jBPM4的源碼。(用戶指南的翻譯見上一篇博客)

    1. 簡(jiǎn)介
    1.1. 目標(biāo)讀者
    1.2. 概述
    1.3. 源代碼和WIKI
    1.4. Maven倉(cāng)庫(kù)
    1.5. 依賴庫(kù)
    2. 孵化器
    2.1. timer定時(shí)器
    2.1.1. 持續(xù)時(shí)間表達(dá)式
    2.1.2. 工作日歷
    2.1.3. 定時(shí)器流向
    2.1.4. 定時(shí)器事件
    2.1.5. 定時(shí)器工作時(shí)間
    2.1.6. 定時(shí)器重復(fù)
    2.2. group
    2.2.1. 簡(jiǎn)單group
    2.2.2. group 定時(shí)器
    2.2.3. group 多入口
    2.2.4. group 同步
    2.2.5. group 秘密
    2.3. 創(chuàng)建組
    2.4. Task outcomes
    3. 從jBPM3轉(zhuǎn)換到j(luò)BPM4
    3.1. jBPM4的目標(biāo)
    3.2. 知識(shí)范圍
    3.3. 流程轉(zhuǎn)換工具
    3.3.1. 概述
    3.3.2. 參數(shù)
    3.3.3. 使用示例
    3.3.4. 高級(jí)應(yīng)用
    3.4. 解釋和修改
    4. 流程虛擬機(jī)
    5. 架構(gòu)
    5.1. APIs
    5.2. 活動(dòng)API
    5.3. 事件監(jiān)聽API
    5.4. 客戶端API
    5.5. 環(huán)境
    5.6. 命令
    5.7. 服務(wù)
    6. 實(shí)現(xiàn)基本活動(dòng)
    6.1. ActivityBehaviour
    6.2. ActivityBehaviour實(shí)例
    6.3. ExternalActivityBehaviour
    6.4. ExternalActivity實(shí)例
    6.5. 基本流程執(zhí)行
    6.6. 事件
    6.7. 事件傳播
    7. 流程剖析
    8. 高級(jí)圖形執(zhí)行
    8.1. 循環(huán)
    8.2. 默認(rèn)執(zhí)行行為
    8.3. 功能活動(dòng)
    8.4. 執(zhí)行和線程
    8.5. 流程同步
    8.6. 異常處理器
    8.7. 流程修改
    8.8. 鎖定和流程狀態(tài)
    9. 配置
    9.1. 基本配置
    9.2. 自定義身份認(rèn)證組件
    10. 持久化
    11. 計(jì)劃執(zhí)行器
    11.1. 概述
    11.2. 配置
    12. 高級(jí)郵件支持
    12.1. 生產(chǎn)者
    12.1.1. 默認(rèn)生產(chǎn)者
    12.2. 模板
    12.3. 服務(wù)器
    12.3.1. 多服務(wù)器
    12.4. 擴(kuò)展點(diǎn)
    12.4.1. 自定義生產(chǎn)者
    12.4.1.1. 例子:自定義附件
    13. 軟件日志
    13.1. 配置
    13.2. 目錄
    13.3. JDK日志
    13.4. 調(diào)試持久化
    14. 歷史
    15. JBoss集成
    15.1. 打包流程歸檔
    15.2. 把流程歸檔發(fā)布成一個(gè)jBoss實(shí)例
    15.3. 流程發(fā)布和版本管理
    15.4. 流程引擎和J2EE/JEE編程模型
    16. Spring集成
    16.1. 概述
    16.2. 配置
    16.3. 使用
    16.4. 測(cè)試
    A. 修改日志
    posted @ 2009-07-14 00:28 卡宴 閱讀(3355) | 評(píng)論 (11)編輯 收藏
    jBPM4的GA將會(huì)在明天發(fā)布,官方的用戶手冊(cè)已經(jīng)更新到GA版本了。每次新的版本一發(fā)布,我們也會(huì)立刻更新,這次用戶手冊(cè)主要是修改了jPDL的內(nèi)容,然后給變量那章添加了不少內(nèi)容,其他章節(jié)基本都是補(bǔ)充了部分內(nèi)容。現(xiàn)在還沒有經(jīng)過(guò)完整的校對(duì),有翻譯不妥的地方還請(qǐng)大家多提反饋意見。

    1. 導(dǎo)言
    1.1. 許可證與最終用戶許可協(xié)議
    1.2. 下載
    1.3. 源碼
    1.4. 什么是jBPM
    1.5. 文檔內(nèi)容
    1.6. 從jBPM 3升級(jí)到j(luò)BPM 4
    2. 安裝配置
    2.1. 發(fā)布
    2.2. 必須安裝的軟件
    2.3. 快速上手
    2.4. Ant腳本
    2.5. JBoss
    2.6. Database
    2.7. Tomcat
    2.8. 配置文件
    2.9. 流程設(shè)計(jì)器(GPD)
    2.9.1. 獲得eclipse
    2.9.2. 添加更新站點(diǎn)gpd/jbpm-gpd-site.zip
    2.9.3. 定義jBPM用戶庫(kù)
    2.9.4. 在目錄中添加jPDL4模式
    2.9.5. 導(dǎo)入示例
    2.9.6. 使用ant添加部分文件
    3. 流程設(shè)計(jì)器(GPD)
    3.1. 創(chuàng)建一個(gè)新的流程文件
    3.2. 編輯流程文件的源碼
    4. 部署業(yè)務(wù)歸檔
    4.1. 部署流程文件和流程資源
    4.2. 部署java類
    5. 服務(wù)
    5.1. 流程定義,流程實(shí)例和執(zhí)行
    5.2. ProcessEngine流程引擎
    5.3. Deploying a process部署流程
    5.4. 卸載已發(fā)布的流程定義
    5.5. 刪除流程定義
    5.6. 啟動(dòng)一個(gè)新的流程實(shí)例
    5.6.1. 最新的流程實(shí)例
    5.6.2. 指定流程版本
    5.6.3. 使用key
    5.6.4. 使用變量
    5.7. 執(zhí)行等待的流向
    5.8. TaskService任務(wù)服務(wù)
    5.9. HistoryService歷史服務(wù)
    5.10. ManagementService管理服務(wù)
    6. jPDL
    6.1. process流程處理
    6.2. 控制流程Activities活動(dòng)
    6.2.1. start啟動(dòng)
    6.2.2. State狀態(tài)節(jié)點(diǎn)
    6.2.2.1. 序列狀態(tài)節(jié)點(diǎn)
    6.2.2.2. 可選擇的狀態(tài)節(jié)點(diǎn)
    6.2.3. decision決定節(jié)點(diǎn)
    6.2.3.1. decision決定條件
    6.2.3.2. decision expression唯一性表達(dá)式
    6.2.3.3. Decision handler決定處理器
    6.2.4. concurrency并發(fā)
    6.2.5. end結(jié)束
    6.2.5.1. end process instance結(jié)束流程處理實(shí)例
    6.2.5.2. end execution結(jié)束流向
    6.2.5.3. end multiple多個(gè)結(jié)束
    6.2.5.4. end State結(jié)束狀態(tài)
    6.2.6. task
    6.2.6.1. 任務(wù)分配者
    6.2.6.2. task候選人
    6.2.6.3. 任務(wù)分配處理器
    6.2.6.4. 任務(wù)泳道
    6.2.6.5. 任務(wù)變量
    6.2.6.6. 在任務(wù)中支持e-mail
    6.2.7. sub-process子流程
    6.2.7.1. sub-process變量
    6.2.7.2. sub-process外出值
    6.2.7.3. sub-process外向活動(dòng)
    6.2.8. custom
    6.3. 原子活動(dòng)
    6.3.1. java
    6.3.2. script腳本
    6.3.2.1. script expression腳本表達(dá)式
    6.3.2.2. script 文本
    6.3.3. hql
    6.3.4. sql
    6.3.5. mail
    6.4. Common activity contents通用活動(dòng)內(nèi)容
    6.5. Events事件
    6.5.1. 事件監(jiān)聽器示例
    6.5.2. 事件傳播
    6.6. 異步調(diào)用
    6.6.1. 異步活動(dòng)
    6.6.2. 異步分支
    6.7. 用戶代碼
    7. Variables變量
    7.1. 變量作用域
    7.2. 變量類型
    8. Scripting腳本
    9. Indentity身份認(rèn)證
    10. 支持郵件
    10.1. 生產(chǎn)者
    10.1.1. 默認(rèn)生產(chǎn)者
    10.2. 模板
    10.3. 服務(wù)器
    10.3.1. 多服務(wù)器
    10.4. 擴(kuò)展點(diǎn)
    10.4.1. 自定義生產(chǎn)者
    10.4.1.1. 例子:自定義附件
    A. 修改日志
    posted @ 2009-07-09 10:35 卡宴 閱讀(1481) | 評(píng)論 (4)編輯 收藏
      最近一直在整流程控制臺(tái),發(fā)現(xiàn)還是有不少成就感的,尤其昨天又實(shí)現(xiàn)了動(dòng)畫回放流程。這可是忽悠領(lǐng)導(dǎo)的最佳手段啊,我先給大家看一下我們控制臺(tái)的規(guī)劃和進(jìn)度(提供源碼下載地址
    ):

    -------------------------------------------------近期
    * 細(xì)化task的生命周期,重新整理task操作
    * 流程實(shí)例歷史
      * 表格方式查看流程歷史
     

    ------------------------------------------------- 遠(yuǎn)景
    * 流程仿真
    * 修改流程圖
    * 細(xì)粒度權(quán)限控制
    * 回退
    * 會(huì)簽
    * 委派
    * swimlane
    * BI
    * BAM
    * 儀表盤


    -------------------------------------------------ChangeLog

    * 2009-07-01
    * [DONE] 實(shí)現(xiàn)動(dòng)畫方式回放流程

    * [DONE] 實(shí)現(xiàn)deployment的suspend, resume(CR1顯示已暫停定義列表時(shí)出現(xiàn)問題,trunk下已修正,等待GA)
    * [DONE] 實(shí)現(xiàn)processInstance的suspend, resume, end(CR1和trunk里,都沒有暴露suspend和resume方法)
    * [DONE] 實(shí)現(xiàn)personalTasks, groupTasks, take task, cancel task

    * 2009-06-29

    * [DONE] 登陸頁(yè)面,登錄名和密碼為1/1
    * [DONE] 添加start和signal,complete task時(shí),添加變量
    * [DONE] 整合web流程設(shè)計(jì)器,可以直接發(fā)布流程定義
    * [DONE] 國(guó)際化

    * 2009-06-01 and before

    * [DONE] 發(fā)布xml格式的流程定義
    * [DONE] 流程定義管理(list, start, delete)
    * [DONE] 顯示流程圖(只在Process Instance詳細(xì)信息中可顯示)
    * [DONE] 流程實(shí)例管理(list, signal, view, delete)
    * [DONE] 任務(wù)管理(list, complete)
    * [DONE] 追蹤流程圖(顯示Process Instance的當(dāng)前位置)
    * [DONE] 多流向選擇
    * [DONE] 用戶權(quán)限(user, group, membership的CRUD功能)
    * [DONE] 報(bào)表(most active process)

    呵呵,現(xiàn)在實(shí)現(xiàn)的功能畢竟還是有限,我們的功能規(guī)劃在一定程度上可能有些局限,希望大家能給多提提建議,認(rèn)為控制臺(tái)里還可以加些什么功能。這可是開源的啊,大家為了自己也要多提出建議來(lái),O(∩_∩)O哈哈~

    下面是我們控制臺(tái)一些功能的視頻演示,包括流程設(shè)計(jì)和發(fā)布,動(dòng)畫回放流程等。
    大家可以看看視頻:http://www.family168.com/bbs/dispbbs.asp?boardid=6&Id=473
    截圖請(qǐng)看:http://www.family168.com/bbs/dispbbs.asp?boardid=6&Id=463
    svn的下載地址:http://jbpmside.googlecode.com/svn/trunk

    posted @ 2009-07-02 12:34 卡宴 閱讀(1156) | 評(píng)論 (4)編輯 收藏
         摘要: 我們的控制臺(tái)現(xiàn)已實(shí)現(xiàn)了流程管理、流程監(jiān)控、流程建模和仿真以及報(bào)表等,建模和仿真是使用js做了一個(gè)web設(shè)計(jì)器jPDL整合在控制臺(tái)中。  閱讀全文
    posted @ 2009-06-29 14:11 卡宴 閱讀(1672) | 評(píng)論 (1)編輯 收藏
    要知道如何將jBPM4與Spring整合,可以先了解jBPM4的IOC容器,如果不了解的可以先看ronghao的這篇文章http://www.javaeye.com/topic/381607,是介紹jBPM4的IOC容器的。下面我們介紹jBPM與Spring整合的2種方式:
       第一種:手工將SessionFactory放入jBPM4中。
       第1步:更改jbpm.spring.default.cfg.xml配置文件,將下面的部分注釋掉
      <!--
        <hibernate-configuration>
          <cfg resource="jbpm.hibernate.cfg.xml" />
        </hibernate-configuration>

        <hibernate-session-factory />
      -->
       注釋的部分是在jBPM4中創(chuàng)建了sessionFactory,而我們只需要一個(gè)sessionFactory。既然要將jBPM4與Spring的整 合,那就希望由Spring來(lái)統(tǒng)一管理sessionFactory和事務(wù),在Spring的配置文件中構(gòu)造一個(gè)sessionFactory。 ProcessEngine是jBPM4的Facade模式,一切由它與外部交互,
      第2步:在Spring配置文件中寫一個(gè)bean:
    <bean id="processEngine" class="com.family168.jbpm.ProcessEngineFactoryBean">
            <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    第3步:在ProcessFactoryBean中注入SessionFactory:
      public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
      }
    第4步:在ProcessFactoryBean中創(chuàng)建一個(gè)SpringConfiguration,然后將sessionFactory放入 SpringConfiguration中,再?gòu)腟pringConfiguration得到processEngine,代碼如下:
         public void afterPropertiesSet() {
            SpringConfiguration cfg = new      SpringConfiguration(jbpmConfigurationLocation);
            cfg.setApplicationContext(applicationContext);

            cfg.setSessionFactory(sessionFactory);
            this.processEngine = cfg.buildProcessEngine();
        }
    然后我們的工作就可以開展了,可以從processEngine得到所有的service。比如:
        ProcessEngine processEngine = (ProcessEngine) ctx.getBean("processEngine");
        RepositoryService repositoryService = processEngine.getRepositoryService();。
    第2種:獲得Hibernate的SessionFactory。
      第1步:與第一種方式的第1步一樣。
      第2步:更改jbpm.tx.spring.cfg.xml配置文件:
      將     
         <standard-transaction-interceptor/>
      改成    <spring-transaction-interceptor current="true" />
      然后將
        <transaction/>
        <hibernate-session/>
      改成 <hibernate-session current="true"/>
    這部分修改是將jBPM4創(chuàng)建的spring事務(wù)和hibernate的session改成從當(dāng)前的ThreadLocal中獲得session和事務(wù)。
    第3步:在Spring配置文件中寫bean,processEngine和template:
    <bean id="jbpmConfiguration" class="org.jbpm.pvm.internal.cfg.SpringConfiguration">
            <constructor-arg value="jbpm/jbpm.cfg.xml" />
        </bean>

        <bean id="processEngine" factory-bean="jbpmConfiguration" factory-method="buildProcessEngine" />

        <bean id="jbpmTemplate" class="com.family168.jbpm.JbpmTemplate">
            <property name="processEngine" ref="processEngine"/>
            <property name="dataSource" ref="dataSource"/>
        </bean>
    processEngine直接使用factory-bean指向jbpmConfiguration,也就是 org.jbpm.pvm.internal.cfg.SpringConfiguration,并從SpringConfiguration的 buildProcessEngine中獲得。
    jbpmTemplate主要是控制事務(wù),在processEngine外面創(chuàng)建事務(wù),這樣使用的時(shí)候會(huì)先調(diào)用jbpmTemplate,再調(diào)用processEngine,否則它會(huì)說(shuō)事務(wù)沒有啟動(dòng)。在jbpmTemplate中注入processEngine:
        public void setProcessEngine(ProcessEngine processEngine) {
            this.processEngine = processEngine;
        }
        這里我的理解是我們?cè)谏厦嬉呀?jīng)將事務(wù)改成從當(dāng)前的Threadlocal中獲得,所以jBPM4是必須當(dāng)前有事務(wù),如果我沒有創(chuàng)建事務(wù)的話,在使用 processEngine時(shí)就會(huì)說(shuō)事務(wù)沒有啟動(dòng)。所以我們就封裝了一個(gè)jbpmTemplate,如果我的理解有誤還請(qǐng)大家指出。
       第1種整合方式的例子下載http://www.family168.com/,第2種整合方式之后可以看我們的jBPM-Side里的控制臺(tái)。

    posted @ 2009-06-29 13:27 卡宴 閱讀(1488) | 評(píng)論 (0)編輯 收藏
    7.6. 流程同步

    為了進(jìn)行流程同步建模,在執(zhí)行中這是一個(gè)父子樹形結(jié)構(gòu)。 這個(gè)想法是執(zhí)行主路徑是樹的根。 流程的主路徑也被稱作流程實(shí)例。 當(dāng)在給定流程定義上啟動(dòng)或創(chuàng)建一個(gè)新流程實(shí)例時(shí), 執(zhí)行便被創(chuàng)建。

    現(xiàn)在,因?yàn)閳?zhí)行的主路徑和流程實(shí)例是相同對(duì)象, 這保證了用法的簡(jiǎn)單, 在沒有同步情況的簡(jiǎn)單流程下。
    基本執(zhí)行結(jié)構(gòu)的UML類圖



    圖 7.6. 基本執(zhí)行結(jié)構(gòu)的UML類圖

    為了建立執(zhí)行的多同步路徑,活動(dòng)實(shí)現(xiàn)比如一個(gè)分支或切分 創(chuàng)建子執(zhí)行, 使用ActivityExecution.createExecution方法。 活動(dòng)實(shí)現(xiàn)比如結(jié)合或合并可以停止流程的這些同步路徑, 通過(guò)調(diào)用執(zhí)行同步的stop方法。

    只有葉子執(zhí)行可以激活,非葉子執(zhí)行應(yīng)該不是激活的。 這個(gè)執(zhí)行的樹形結(jié)構(gòu)沒有堅(jiān)持一個(gè)同步或結(jié)合行為的特殊類型。 它從事著分支或和切分 和結(jié)合或和合并來(lái)使用執(zhí)行樹結(jié)構(gòu), 用任何方式,他們想定義期望的同步行為。 這里我們看一個(gè)同步執(zhí)行的例子。
    執(zhí)行的同步路徑



    圖 7.7. 執(zhí)行的同步路徑

    這里有執(zhí)行的一個(gè)付款和一個(gè)發(fā)貨路徑。 在這種情況,水平線上的活動(dòng)展示了分支和結(jié)合。這個(gè)執(zhí)行顯示了三個(gè)執(zhí)行。 執(zhí)行的主路徑不是激活的(顯示成灰色) 執(zhí)行的付款和發(fā)貨路徑是激活的,分別指向了 bill和ship活動(dòng)。

    從事活動(dòng)行為的實(shí)現(xiàn),是他們想使用的執(zhí)行結(jié)構(gòu)。 假設(shè)多個(gè)任務(wù)必須在執(zhí)行進(jìn)行之前完成。 活動(dòng)行為可以為這個(gè)產(chǎn)生一系列子執(zhí)行。 或者可以選擇,任務(wù)組件可以支持任務(wù)組, 分配給單獨(dú)的執(zhí)行。在那種情況, 任務(wù)組件成為同步任務(wù)的響應(yīng), 因此把這個(gè)責(zé)任移動(dòng)到執(zhí)行樹形結(jié)構(gòu)范圍之外。
    7.7. 異常處理器

    在所有分配到流程的代碼中,像 Activity,EventListeners和 Condition,可能分配給異常處理器。 這可以想成是把這些實(shí)現(xiàn)的方法實(shí)現(xiàn)包含在try-catch塊中。 但是為了構(gòu)建更多可復(fù)用的構(gòu)建塊, 為了委派類和異常處理邏輯, 異常處理器可以添加到核心流程模型中。

    一個(gè)異常處理器可以分配給任何流程元素。 當(dāng)一個(gè)異常發(fā)生在一個(gè)委派類中,一個(gè)匹配的異常處理器就會(huì)被找到。 如果找到了一個(gè)這樣的異常處理器,它會(huì)有一個(gè)處理這個(gè)異常的機(jī)會(huì)。

    如果一個(gè)異常處理器處理完成,沒有出現(xiàn)問題,然后這個(gè)異常會(huì) 被認(rèn)為是處理了,就會(huì)在委派代碼調(diào)用后繼續(xù)。 比如,一個(gè)轉(zhuǎn)移有三個(gè)動(dòng)作,第二個(gè)動(dòng)作拋出一個(gè)異常, 這個(gè)異常被異常處理器處理,然后

    編寫自動(dòng)活動(dòng),異常處理器提醒是很容易的。 默認(rèn)是任意執(zhí)行。沒有方法需要在執(zhí)行中調(diào)用。 所以如果一個(gè)自動(dòng)活動(dòng)拋出一個(gè)異常,被異常處理器處理, 這個(gè)執(zhí)行會(huì)在這個(gè)執(zhí)行后繼續(xù)執(zhí)行。這對(duì)于控制流向活動(dòng) 就會(huì)有一個(gè)更大的困難。它們可能需要包含try-finally塊 來(lái)調(diào)用執(zhí)行中對(duì)應(yīng)的方法,在異常處理器 獲得一個(gè)機(jī)會(huì)來(lái)處理異常。比如,如果活動(dòng)是等待狀態(tài), 然后發(fā)生了一個(gè)異常,這里就會(huì)有一個(gè)風(fēng)險(xiǎn),線程會(huì)跳出 execution.waitForSignal()的調(diào)用, 導(dǎo)致執(zhí)行在這個(gè)活動(dòng)以后繼續(xù)執(zhí)行。

    TODO: exceptionhandler.isRethrowMasked

    TODO: transactional exception handlers

    TODO: we never catch errors
    7.8. 流程修改

    TODO: 流程修改
    7.9. 鎖定和流程狀態(tài)

    一個(gè)執(zhí)行的狀態(tài)不是激活就是鎖定。 一個(gè)激活的執(zhí)行不是執(zhí)行就是等待外部觸發(fā)器。 如果一個(gè)執(zhí)行不是STATE_ACTIVE,那么它就是被鎖定。 一個(gè)鎖定的執(zhí)行是只讀的,不能接受任何外部觸發(fā)器。

    當(dāng)一個(gè)新執(zhí)行被創(chuàng)建時(shí),它是STATE_ACTIVE。 為了把狀態(tài)修改成鎖定狀態(tài),使用lock(String)。一些STATE_*常量 被提供了,它們演示了最常用的鎖定狀態(tài)。 但是在圖片中的'...'狀態(tài)展示了任何字符串 都可以作為狀態(tài)提供給lock方法。
    執(zhí)行的狀態(tài)



    圖 7.8. 執(zhí)行的狀態(tài)

    如果一個(gè)執(zhí)行被鎖定,修改執(zhí)行的方法會(huì) 拋出一個(gè)PvmException,信息會(huì)引用真實(shí)的鎖定狀態(tài)。 觸發(fā)事件,更新變量,更新優(yōu)先級(jí),添加注釋 不會(huì)當(dāng)做是修改執(zhí)行。 子節(jié)點(diǎn)的創(chuàng)建和刪除也不會(huì)檢測(cè), 這意味著那些方法可以被外部API客戶和活動(dòng)行為調(diào)用, 即使執(zhí)行在鎖定狀態(tài)。

    確保比較getState()和STATE_*常量時(shí) 使用.equals,不要使用'==',因?yàn)槿绻麍?zhí)行從持久存儲(chǔ)加載。 會(huì)創(chuàng)建一個(gè)新字符串,而不是使用常量。

    一個(gè)執(zhí)行實(shí)現(xiàn)會(huì)被鎖定:

        * 當(dāng)它結(jié)束
        * 當(dāng)它暫停
        * 在異步延續(xù)過(guò)程中

    更多的,鎖定可以被活動(dòng)實(shí)現(xiàn)使用, 讓執(zhí)行在等待狀態(tài)下只讀,然后為這個(gè)執(zhí)行傳遞 的外部實(shí)例就像這樣:

        * 一個(gè)人員任務(wù)
        * 一個(gè)服務(wù)調(diào)用
        * 一個(gè)等待狀態(tài)當(dāng)探測(cè)器檢測(cè)一個(gè)文件的出現(xiàn)時(shí)就結(jié)束

    在這些情況,策略是外部實(shí)例應(yīng)該獲得 執(zhí)行的完全控制,因?yàn)樗胍刂剖裁磻?yīng)該允許,什么不應(yīng)該。 為了獲得那種控制,他們鎖定了執(zhí)行,所以所有內(nèi)部交互 必須通過(guò)外部實(shí)例傳遞。

    一個(gè)創(chuàng)建外部實(shí)例的主要原因是, 它們可以在執(zhí)行已經(jīng)執(zhí)行過(guò)還存在。比如, 在服務(wù)調(diào)用的情況,定時(shí)器可以導(dǎo)致執(zhí)行獲得超時(shí)轉(zhuǎn)移。 當(dāng)響應(yīng)在超時(shí)后到達(dá),服務(wù)調(diào)用實(shí)例應(yīng)該 確認(rèn)它沒有signal這個(gè)執(zhí)行。所以服務(wù)調(diào)用可以看做 一個(gè)活動(dòng)實(shí)例(活動(dòng)實(shí)例) 是對(duì)活動(dòng)每個(gè)執(zhí)行的唯一實(shí)例。

    外部實(shí)例它們自己負(fù)責(zé)管理執(zhí)行鎖定。 如果定時(shí)器和客戶端應(yīng)用結(jié)果是選擇 外部實(shí)例,而不是直接選擇執(zhí)行,然后在理論上是不必要的。 它是從事活動(dòng)行為實(shí)現(xiàn),無(wú)論它希望 執(zhí)行鎖定還是解鎖。
    posted @ 2009-06-26 12:05 卡宴 閱讀(1092) | 評(píng)論 (0)編輯 收藏
    活動(dòng)可以實(shí)現(xiàn)循環(huán),基于轉(zhuǎn)移或活動(dòng)組合。 循環(huán)可以包含等待狀態(tài)。

    為了支持多次自動(dòng)循環(huán)執(zhí)行,流程虛擬機(jī) 把執(zhí)行的傳播從尾部遞歸轉(zhuǎn)換成while循環(huán)。
    7.2. 子流程

    TODO: 子流程
    7.3. 默認(rèn)執(zhí)行行為

    當(dāng)一個(gè)Activity被用作活動(dòng)行為, 它可以使用下面的方法從外部控制流程:

        * waitForSignal()
        * take(Transition)
        * end(*)
        * execute(Activity)
        * createExecution(*)

    當(dāng)Activity實(shí)現(xiàn)用做活動(dòng)行為, 沒有調(diào)用任何下面的流程傳播方法,然后 在活動(dòng)執(zhí)行時(shí),執(zhí)行會(huì)使用默認(rèn)執(zhí)行行為。

    默認(rèn)執(zhí)行行為定義在下面:

        * 如果當(dāng)前活動(dòng)有一個(gè)默認(rèn)向外轉(zhuǎn)移,選擇它。
        * 如果當(dāng)前活動(dòng)有一個(gè)父活動(dòng),回退到父活動(dòng)。
        * 否則,結(jié)束這個(gè)執(zhí)行。

    流程語(yǔ)言可以重寫默認(rèn)執(zhí)行行為, 通過(guò)重寫ExecutionImpl中的 proceed方法。
    7.4. 功能活動(dòng)

    活動(dòng)也可以用作事件監(jiān)聽器,被稱作功能活動(dòng)。 自動(dòng)活動(dòng)的例子是發(fā)送郵件,執(zhí)行數(shù)據(jù)庫(kù)更新, 生成pdf,計(jì)算平均數(shù),等等。 所有這些都是自動(dòng)活動(dòng),沒有改變執(zhí)行流向。 這里是這些活動(dòng)如何實(shí)現(xiàn):

    public class FunctionalActivity implements Activity, EventListener {
        public void execute(ActivityExecution execution) {
          perform(execution);
        }
        public void notify(EventListenerExecution execution) {
          perform(execution);
        }
        void perform(OpenExecution execution) {
          ...do functional work...
        }
      }

    perform方法獲得一個(gè)OpenExecution, 這是ActivityExecution和 EventListenerExecution的超類。 OpenExecution沒有提供任何特定目的的方法, 但是依舊是當(dāng)前狀態(tài),流程定義可以通過(guò)變量檢驗(yàn), 這包含了環(huán)境信息 對(duì)應(yīng)流程執(zhí)行。

    這些方法其實(shí)都不能調(diào)用執(zhí)行傳播方法。 所以在perform方法完成后,執(zhí)行會(huì) 執(zhí)行默認(rèn)的方式。
    7.5. 執(zhí)行和線程

    這一章解釋流程虛擬機(jī)如何通過(guò)客戶端的線程, 把一個(gè)執(zhí)行從一個(gè)等待狀態(tài)帶到另一個(gè)。

    當(dāng)一個(gè)客戶調(diào)用一個(gè)執(zhí)行的一個(gè)方法(比如signal方法)。 默認(rèn),流程虛擬機(jī)會(huì)使用線程執(zhí)行流程 直到它到達(dá)一個(gè)等待狀態(tài)。一旦下一個(gè)等待狀態(tài)到達(dá), 這個(gè)方法會(huì)返回,客戶端的線程就會(huì)返回。 這是流程虛擬機(jī)操作的默認(rèn)方式。 兩個(gè)更多的異步執(zhí)行可以補(bǔ)充默認(rèn)行為: 異步繼續(xù) 和異步命令服務(wù)。

    下一個(gè)流程會(huì)展示基本理論。 它有三個(gè)等待狀態(tài)和四個(gè)自動(dòng)活動(dòng)。
    有很多順序自動(dòng)活動(dòng)的流程。



    圖 7.1. 有很多順序自動(dòng)活動(dòng)的流程。

    這里是如何構(gòu)建流程:

    ClientProcessDefinition processDefinition = ProcessFactory.build("automatic")
        .activity("wait 1").initial().behaviour(new WaitState())
          .transition().to("automatic 1")
        .activity("automatic 1").behaviour(new Display("one"))
          .transition().to("wait 2")
        .activity("wait 2").behaviour(new WaitState())
          .transition().to("automatic 2")
        .activity("automatic 2").behaviour(new Display("two"))
          .transition().to("automatic 3")
        .activity("automatic 3").behaviour(new Display("three"))
          .transition().to("automatic 4")
        .activity("automatic 4").behaviour(new Display("four"))
          .transition().to("wait 3")
        .activity("wait 3").behaviour(new WaitState())
    .done();

    讓我們和你一起順著流程的執(zhí)行一起走。

    ClientExecution execution = processDefinition.startProcessInstance();

    啟動(dòng)一個(gè)新執(zhí)行意味著初始活動(dòng)被執(zhí)行。 所以如果一個(gè)自動(dòng)活動(dòng)是初始活動(dòng),這意味著第一個(gè)未命名的向外轉(zhuǎn)移會(huì)被立刻選擇。 這些都發(fā)生在startProcessInstance調(diào)用的內(nèi)部。

    然而在這種情況下,初始活動(dòng)是一個(gè)等待狀態(tài)。 所以startProcessInstance方法會(huì)立刻返回, 執(zhí)行會(huì)定位到初始活動(dòng)'wait 1'。
    一個(gè)新執(zhí)行會(huì)被定為到'wait 1'。



    圖 7.2. 一個(gè)新執(zhí)行會(huì)被定為到'wait 1'。

    然后一個(gè)外部觸發(fā)器會(huì)執(zhí)行signal方法。

    execution.signal();

    像上面解釋的介紹WaitState, signal會(huì)導(dǎo)致選擇默認(rèn)的轉(zhuǎn)移。 轉(zhuǎn)移會(huì)把執(zhí)行移動(dòng)到automatic 1活動(dòng),并執(zhí)行它。 automatic 1中的Display活動(dòng)的execute方法, 向控制臺(tái)打印一行,它不會(huì) 調(diào)用execution.waitForSignal()。 因此,執(zhí)行會(huì)通過(guò)選擇automatic 1外部的默認(rèn)轉(zhuǎn)移進(jìn)行執(zhí)行。 在這種狀態(tài),signal方法一直阻塞著。另一個(gè)需要考慮的方式是執(zhí)行方法, 像signal會(huì)使用客戶端的線程 來(lái)攔截流程定義,直到到達(dá)一個(gè)等待狀態(tài)。

    然后執(zhí)行到達(dá)wait 2, 執(zhí)行WaitState活動(dòng)。那個(gè)方法會(huì)調(diào)用 execution.waitForSignal(),這會(huì)導(dǎo)致signal方法返回。 線程會(huì)返回到調(diào)用signal方法 的客戶端。

    所以,當(dāng)signal方法返回時(shí),執(zhí)行定義到wait 2。
    一個(gè)signal會(huì)把執(zhí)行從'initial'帶到'wait 2'。



    圖 7.3. 一個(gè)signal會(huì)把執(zhí)行從'initial'帶到'wait 2'。

    然后執(zhí)行會(huì)等待一個(gè)外部觸發(fā)器, 像是一個(gè)對(duì)象(更準(zhǔn)確的是一個(gè)對(duì)象圖)在內(nèi)存中, 直到下一個(gè)外部觸發(fā)器執(zhí)行signal方法。

    execution.signal();

    第二個(gè)調(diào)用的signal會(huì)直接讓執(zhí)行進(jìn)入wait 3, 在它返回之前。
    第二個(gè)signal讓執(zhí)行進(jìn)入'wait 3'。



    圖 7.4. 第二個(gè)signal讓執(zhí)行進(jìn)入'wait 3'。

    使用這個(gè)范例的好處是相同的流程定義可以在 客戶執(zhí)行模式中執(zhí)行 (在內(nèi)存內(nèi)不使用持久化),就像在持久化執(zhí)行模式, 依賴應(yīng)用和環(huán)境。

    當(dāng)在持久化模式下執(zhí)行一個(gè)流程,你如何綁定 流程執(zhí)行到數(shù)據(jù)庫(kù)的事務(wù)上。
    持久化模式下的事務(wù)超時(shí)



    圖 7.5. 持久化模式下的事務(wù)超時(shí)

    在大多情況下,計(jì)算工作是流程需要完成的一部分, 在外部觸發(fā)器(紅色部分)之后的部分,其實(shí)很少。 一般來(lái)說(shuō),處理流程執(zhí)行和處理UI傳遞過(guò)來(lái)的請(qǐng)求 的事務(wù)不會(huì)超過(guò)一秒。 而業(yè)務(wù)流程中的等待狀態(tài)可能超過(guò)幾小時(shí),幾天甚至幾年。 當(dāng)?shù)却隣顟B(tài)啟動(dòng)后,線索就變得很清晰, 在等待狀態(tài)啟動(dòng)之前,只有計(jì)算工作的完成包含在事務(wù)中。

    考慮一下這種方式: "當(dāng)?shù)竭_(dá)審批時(shí),所有的自動(dòng)流程需要做的是什么, 在流程系統(tǒng)需要等待另一個(gè)外部觸發(fā)器之前?"。 除非pdf需要被創(chuàng)建,或大郵件需要被發(fā)送, 大部分時(shí)候,它消耗的時(shí)間都是可以忽略的。 這就是為什么在默認(rèn)的持久化執(zhí)行模式下, 流程工作在客戶端線程下執(zhí)行。

    這個(gè)原因也保證著流程同步路徑的情況。 當(dāng)一個(gè)執(zhí)行的單獨(dú)路徑切分成流程同步路徑, 流程花在計(jì)算上的時(shí)間是可忽略的。 所以為什么分支或切分活動(dòng)實(shí)現(xiàn)是有意義的, 目標(biāo)持久化模式產(chǎn)生的同步路徑在同一個(gè)線程中按順序執(zhí)行。 基本上它們都只是在同一個(gè)事務(wù)中的計(jì)算工作。 因?yàn)榉种Щ蚯蟹种烂總€(gè)執(zhí)行的同步路徑會(huì)返回,所以這只能被完成, 當(dāng)出現(xiàn)一個(gè)等待狀態(tài)的時(shí)候。

    因?yàn)檫@里有一個(gè)困難的概念需要掌握,我會(huì)再次使用其他詞語(yǔ)來(lái)解釋它。 從頭再看一次在持久化執(zhí)行模式下被流程執(zhí)行創(chuàng)建出來(lái)的它。 如果在一個(gè)事務(wù)中,一個(gè)執(zhí)行被給與一個(gè)外部觸發(fā)器, 那導(dǎo)致執(zhí)行切分成多個(gè)執(zhí)行的同步路徑。 然后執(zhí)行在計(jì)算上的部分也可以忽略。 生成SQL的部分也可以忽略。 因?yàn)樗性谕椒种贤瓿傻墓δ埽仨氃谕粋€(gè)事務(wù)中完成, 這里一般沒有指針在分支或切分實(shí)現(xiàn), 在多個(gè)線程中產(chǎn)生執(zhí)行的同步路徑。

    為了創(chuàng)建可執(zhí)行流程,開發(fā)者需要確切知道什么是自動(dòng)活動(dòng), 什么是等待狀態(tài),哪些線程會(huì)被分配給流程執(zhí)行。 對(duì)于畫業(yè)務(wù)流程的業(yè)務(wù)分析人員,事件就很簡(jiǎn)單了。 對(duì)于他們畫的活動(dòng),他們通常只要知道這是一個(gè)人或是一個(gè)系統(tǒng)響應(yīng)。 但是他們通常不知道如何轉(zhuǎn)換線程和事務(wù)。

    所以對(duì)于開發(fā)者,第一個(gè)任務(wù)是分析什么是流程控制的線程中需要執(zhí)行的, 什么是外部的。 查找外部觸發(fā)器是尋找一個(gè)流程中的等待狀態(tài)的很好的開始, 就像動(dòng)詞和名詞可以在構(gòu)建UML類圖中的元素的規(guī)則。
    posted @ 2009-06-26 12:03 卡宴 閱讀(1160) | 評(píng)論 (0)編輯 收藏
    主站蜘蛛池模板: 亚洲免费电影网站| 亚洲av成人一区二区三区| 亚洲人6666成人观看| 免费看黄视频网站| 久久久精品视频免费观看 | 我想看一级毛片免费的| 亚洲中文无码永久免费| 成年在线观看网站免费| 好男人www免费高清视频在线| 国产精品视频免费| 免费毛片在线看片免费丝瓜视频 | 一级做a爱过程免费视频高清| 另类专区另类专区亚洲| 成年网在线观看免费观看网址| 美女视频黄.免费网址 | 激情亚洲一区国产精品| 亚洲成年网站在线观看| 亚洲AV永久无码精品放毛片| 老司机免费午夜精品视频| 特级毛片在线大全免费播放| 成人免费一区二区三区| 国产在线精品免费aaa片| 全部免费毛片在线播放| 成人免费视频77777| 国产a不卡片精品免费观看 | 67194国产精品免费观看| 免费在线观看的网站| 日产乱码一卡二卡三免费| 亚洲AV无码专区日韩| 国产成人精品日本亚洲网站| 91午夜精品亚洲一区二区三区| 精品国产成人亚洲午夜福利| 久久精品国产亚洲av品善| g0g0人体全免费高清大胆视频| 国偷自产一区二区免费视频| 四虎1515hh永久久免费| 国产精品国产免费无码专区不卡| 日韩精品亚洲专区在线观看| 国产亚洲综合色就色| 亚洲伦理中文字幕| 极品美女一级毛片免费|