黑馬程序員_activiti工作流視頻企業(yè)開發(fā)實(shí)例講解課程_第1頁
黑馬程序員_activiti工作流視頻企業(yè)開發(fā)實(shí)例講解課程_第2頁
黑馬程序員_activiti工作流視頻企業(yè)開發(fā)實(shí)例講解課程_第3頁
黑馬程序員_activiti工作流視頻企業(yè)開發(fā)實(shí)例講解課程_第4頁
黑馬程序員_activiti工作流視頻企業(yè)開發(fā)實(shí)例講解課程_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Activiti 工作流一:Activiti 第一天1:工作流的概念說明:1) 假設(shè):這兩張圖就是華誼兄弟的請(qǐng)假流程圖2) 圖的組成部分:A.人物:B.事件(動(dòng)作):請(qǐng)假、批準(zhǔn)、不批準(zhǔn)工作流(Workflow),就是“業(yè)務(wù)過程的部分或整體在計(jì)算機(jī)應(yīng)用環(huán)境下的自動(dòng) 化”,它主要解決的是“使在多個(gè)參與者之間按照某種預(yù)定義的規(guī)則傳遞文檔、信息或任務(wù)的過程自動(dòng)進(jìn)行,從而實(shí)現(xiàn)某個(gè)預(yù)期的業(yè)務(wù)目標(biāo),或者促使此目標(biāo)的實(shí)現(xiàn)”。工作流管理系統(tǒng)(Workflow Management System, WfMS)是一個(gè)系統(tǒng),它完成工作量的定義和管理,并按照在系統(tǒng)中預(yù)先定義好的工作流規(guī)則進(jìn)行工作流實(shí)例的執(zhí)行。工作流管理

2、系統(tǒng)不是企業(yè)的業(yè)務(wù)系統(tǒng),而是為企業(yè)的業(yè)務(wù)系統(tǒng)的運(yùn)行提供了一個(gè)的支撐環(huán)境。工作流管理(WfMC,Workflow Management Coalition)給出的關(guān)于工作流管理系統(tǒng)的定義是:工作流管理系統(tǒng)是一個(gè)系統(tǒng),它通過執(zhí)行經(jīng)過計(jì)算的流程定義去支持一批專門設(shè)定的業(yè)務(wù)流程。工作流管理系統(tǒng)被用來定義、管理、和執(zhí)行工作流程。工作流管理系統(tǒng)的目標(biāo):管理工作的流程以確保工作在正確的時(shí)間被期望的人員所執(zhí)行在自動(dòng)化進(jìn)行的業(yè)務(wù)過程中人工的執(zhí)行和干預(yù)。2:工作流的執(zhí)行過程演示程序:Activiti 控制臺(tái)3:Activiti 介紹Activiti5 是由Alfresco在 2010 年 5 月 17 日發(fā)布的業(yè)

3、務(wù)流程管理(BPM)框架,它是覆蓋了業(yè)務(wù)流程管理、工作流、服務(wù)協(xié)作等領(lǐng)域的一個(gè)開源的、靈活的、易擴(kuò)展的可執(zhí)行流程語言框架。Activiti 基于 Apache的開源 BPM,創(chuàng)始人 Tom Baeyens 是 JsjBPM 的項(xiàng)目架構(gòu)師,它特色是提供了 eclipse 插件,開發(fā)流程圖??梢酝ㄟ^插件直接繪畫出業(yè)務(wù)3.1:工作流引擎ProsEngine 對(duì)象,這是 Activiti 工作的。負(fù)責(zé)生成流程運(yùn)行時(shí)的各種實(shí)例及數(shù)據(jù)、和管理流程的運(yùn)行。3.2:BPMN業(yè)務(wù)流程建模與標(biāo)注(Business Pros Mand Noion,BPMN) ,描述流程的基本符號(hào),包括這些圖元如何組一個(gè)業(yè)務(wù)流程圖(

4、Business Pros Diagram)3.3:數(shù)據(jù)庫(先學(xué)后看)Activiti 數(shù)據(jù)庫支持:Activiti 的是有數(shù)據(jù)庫的支持,所有的表都以ACT_開頭。第二部分是表示表的用途的兩個(gè)字母標(biāo)識(shí)。 用途也和服務(wù)的API 對(duì)應(yīng)。表結(jié)構(gòu)操作:3.3.1:流程規(guī)則表1)act_re_deployment部署信息表2)act_re_m流程設(shè)計(jì)模型部署表3)act_re_procdef流程定義數(shù)據(jù)表3.3.2:運(yùn)行時(shí)數(shù)據(jù)庫表1)act_ru_execution運(yùn)行時(shí)流程執(zhí)行實(shí)例表2)act_ru_identitylink運(yùn)行時(shí)流程表,主要任務(wù)節(jié)點(diǎn)與參與者的相關(guān)信息3)act_ru_task運(yùn)行時(shí)任

5、務(wù)節(jié)點(diǎn)表4)act_ru_variable運(yùn)行時(shí)流程變量數(shù)據(jù)表3.3.3:歷史數(shù)據(jù)庫表1)act_hi_actinst歷史節(jié)點(diǎn)表2)act_hi_attaent歷史附件表3)ment歷史意見表4)act_hi_identitylink歷史流程表5)act_hi_detail歷史詳情表,提供歷史變量的查詢6)act_hi_procinst歷史流程實(shí)例表7)act_hi_taskinst歷史任務(wù)實(shí)例表8)act_hi_varinst歷史變量表ACT_RE_*: RE表示 reitory。 這個(gè)前綴的表包含了流程定義和流程靜態(tài)資源 (,規(guī)則,等等)。ACT_RU_*: RU表示 runtime。 這

6、些運(yùn)行時(shí)的表,包含流程實(shí)例,任務(wù),變量,異步任務(wù),等運(yùn)行中的數(shù)據(jù)。 Activiti 只在流程實(shí)例執(zhí)行過程中保存這些數(shù)據(jù), 在流程結(jié)束時(shí)就會(huì)刪除這些。 這樣運(yùn)行時(shí)表可以一直很小速度很快。ACT_ID_*: ID表示 identity。 這些表包含,比如用戶,組等等。ACT_HI_*: HI表示 history。 這些表包含歷史數(shù)據(jù),比如歷史流程實(shí)例, 變量,任務(wù)等等。ACT_GE_*: 通用數(shù)據(jù), 用于不同場(chǎng)景下,如存放資源文件。3.3.4:組織機(jī)構(gòu)表用戶組信息表1)act_id_group用戶擴(kuò)展信息表2)act_id_info3)act_id_membership 用戶與用戶組對(duì)應(yīng)信息表4

7、)act_id_user用戶信息表這四很常見,基本的組織機(jī)構(gòu)管理,關(guān)于用戶認(rèn)證方面建議還是自己開發(fā)一套,組件自帶的功能太簡單,使用中有很多需求難以滿足3.3.5:通用數(shù)據(jù)表二進(jìn)制數(shù)據(jù)表1)act_ge_bytearray2)act_ge_property結(jié)構(gòu)時(shí),會(huì)默認(rèn)屬性數(shù)據(jù)表,整個(gè)流程引擎級(jí)別的數(shù)據(jù),初始化表三條3.4:activiti.cfg.xml(activiti 的配置文件)Activiti配置文件,配置流程引擎創(chuàng)建工具的基本參數(shù)和數(shù)據(jù)庫連接池參數(shù)。定義數(shù)據(jù)庫配置參數(shù):jdbcUrl: 數(shù)據(jù)庫的 JDBC URL。jdbcDriver: 對(duì)應(yīng)不同數(shù)據(jù)庫類型的驅(qū)動(dòng)。jdbcUserna

8、me: 連接數(shù)據(jù)庫的用戶名。jdbcPassword: 連接數(shù)據(jù)庫的。基于 JDBC 參數(shù)配置的數(shù)據(jù)庫連接 會(huì)使用默認(rèn)的 MyBatis 連接池。 下面的參數(shù)可以用來配置連接池(來自 MyBatis 參數(shù)):jdbcMaxActiveConnections: 連接池中處于被使用狀態(tài)的連接的最大值。默認(rèn)為 10。jdbcMaxIdleConnections: 連接池中處于空閑狀態(tài)的連接的最大值。jdbcMaxCheckoutTime: 連接被取出使用的最長時(shí)間,超過時(shí)間會(huì)被強(qiáng)制回收。 默認(rèn)為 20000(20 秒)。jdbcMaxWaitTime: 這是一個(gè)底層配置,讓連接池可以在長時(shí)間無法獲得

9、連接時(shí), 打印一條日志,并重新嘗試獲取認(rèn)為 20000(20 秒)。接。(避免因?yàn)殄e(cuò)誤配置導(dǎo)致沉默的操作失敗)。 默示例數(shù)據(jù)庫配置:也可以使用 javax.sql.DataSource。(比如,Apache Commons 的 DBCP):3.5:perties(日志處理)日志的配置文件,Activiti 操作數(shù)據(jù)庫的時(shí)候,整合的日志文件4:準(zhǔn)備環(huán)境4.1:activiti5環(huán)境1)JDK1.6 或者更高版本2)支持的數(shù)據(jù)庫有:h2, oracle,tgres, mssql, db2 等。3)支持 activiti5 運(yùn)行的 jar 包4)開發(fā)環(huán)境為 Eclipse3.7 或者以上版本,mye

10、clipse 為 8.6 版本4.2:相關(guān)資源1)JDK 可以到 sun 的官網(wǎng)htt/technetwork/java/javase/downloads/index.html2)數(shù)據(jù)庫,例如:可以在官網(wǎng)上。ht3)activiti 也可以到 Activiti得到。4)Eclipse3.7 或者 MyEclipse8.6 也可以到相應(yīng)的上獲得。4.3:安裝流程設(shè)計(jì)器(eclipse 插件)4.3.1:安裝方式一在有網(wǎng)絡(luò)的情況下,安裝流程設(shè)計(jì)器步驟如下:1) 打開 Help - Install New Software. 在如下面板中:2)在如下 Install 界面板中,點(diǎn)擊 Add 按鈕:配

11、置新裝插件的地址和名稱3) 然后填入下列字段Name: Activiti BPMN 2.0 designerLocation: 4)回到 Install 界面,在面板正中列表中把所有展示出來的項(xiàng)目都勾上:5)點(diǎn)擊復(fù)選框在 Detail 部分記得選中 Contact all updates sites. , 因?yàn)樗鼤?huì)檢查所有當(dāng)前安裝所需要的插件并可以被 Eclipse.6) 安裝完以后,點(diǎn)擊新建工程 new-Other打開面板,如果看到下圖內(nèi)容:說明安裝成功了。4.3.2:安裝方式二在沒有網(wǎng)絡(luò)的情況下,安裝流程設(shè)計(jì)器步驟如下:1)解壓老師發(fā)給大家的2)把壓縮包中的內(nèi)容放入 eclipse 根目錄

12、的 dropins 文件夾下3)重啟 eclipse,點(diǎn)擊新建工程 new-Other打開面板,如果看到下圖內(nèi)容:說明安裝成功了4.4:對(duì)流程設(shè)計(jì)器的使用說明打開菜單Windows-Preferen-Activiti-Save程流程的生成方式:雖然流程引擎在單獨(dú)部署 bpmn 文件時(shí)會(huì)自動(dòng)生成,但在實(shí)際開發(fā)過程中,自動(dòng)生成的會(huì)導(dǎo)致和 BPMN 中的坐標(biāo)有出入,在實(shí)際項(xiàng)目中展示流程當(dāng)前位置圖會(huì)有問題。所在完成以上配置后,會(huì)由一起上傳就行了。自己來管理流程。在發(fā)布流程時(shí)把流程規(guī)則文件和流程4.5:準(zhǔn)備 Activiti5 開發(fā)環(huán)境4.5.1:添加 Activiti5 的 jar 包在 activi

13、ti-5.13-wars 目錄下是一些示例項(xiàng)目,解壓 activiti-rest 項(xiàng)目,導(dǎo)入 activiti-rest目錄中WEB-INFlib 下所有包。添加到classpath 中。數(shù)據(jù)庫的驅(qū)動(dòng) Activiti由于供,需要使用的是數(shù)據(jù)庫,包中并沒有提自己導(dǎo)入。手動(dòng)導(dǎo)入-connector-java.jar,添加到 classpath 下。4.5.2:初始化數(shù)據(jù)庫在 Activiti 中,在創(chuàng)建會(huì)自動(dòng)建庫,然后創(chuàng)建 23的流程引擎對(duì)象時(shí)會(huì)自動(dòng)建表。如果程序正常執(zhí)行,。4.5.3:添加并制定配置文件在 Actiiti5 中定制流程必定會(huì)操作到數(shù)據(jù)庫,如果都像上面那樣寫一大段代碼會(huì)非常麻煩,

14、所以可以把數(shù)據(jù)庫連接配置寫入配置文件。在 Activiti5 的示例中并沒有現(xiàn)成的 配置文件,所以先得找到 activiti-restWEB-INFclasses 下有:activiti-context.xml :一個(gè)類似 spring 結(jié)構(gòu)的配置文件,清空內(nèi)容后改名為activiti.cfg.xml,用來做流程引擎的相關(guān)配置。按照上面代碼配置 Pro策略,配置文件代碼如下:sEngineConfiguration 對(duì)象,主要定義數(shù)據(jù)庫的連接配置和建表Java 代碼如下:createProsEngineConfigurationFromResource的參數(shù)值為添加的配置文件activiti.

15、cfg.xml 的名稱,執(zhí)行 java 代碼,流程引擎對(duì)象創(chuàng)建成功運(yùn)行后數(shù)據(jù)庫會(huì)自動(dòng)建表。:perties 日志配置文件把兩個(gè)文件放入 resource 目錄下即可。5:API5.1:ProsEngine說明:1) 在 Activiti 中最的類,其他的類都是由他而來。2) 產(chǎn)生方式:面看到了兩種創(chuàng)建 ProsEngine(流程引擎)的方式,而這里要簡化很多,調(diào)用ProsEngines 的 getDefaultProceeEngine 方法時(shí)會(huì)自動(dòng)加載 classpath 下名為activiti.cfg.xml文件。3)可以產(chǎn)生 ReitoryService4)可以產(chǎn)生 RuntimeServ

16、ice5)可以產(chǎn)生 TaskService各個(gè)Service 的作用:5.2:ReitoryService是 Activiti 的倉庫服務(wù)類。所謂的倉庫指流程定義文檔的兩個(gè)文件:bpmn 文件和流程。1)產(chǎn)生方式2)可以產(chǎn)生DeploymentBuilder,用來定義流程部署的相關(guān)參數(shù)3)刪除流程定義5.3:RuntimeService是 activiti 的流程執(zhí)行服務(wù)類??梢詮倪@個(gè)服務(wù)類中獲取很多關(guān)于流程執(zhí)行相關(guān)的信息。ReitoryService管理流程定義RuntimeService執(zhí)行管理,包括啟動(dòng)、推進(jìn)、刪除流程實(shí)例等操作TaskService任務(wù)管理HistoryService歷

17、史管理(執(zhí)行完的數(shù)據(jù)的管理)IdentityService組織機(jī)構(gòu)管理FormService一個(gè)可選服務(wù),任務(wù)表單管理ManagerService5.4:TaskService是 activiti 的任務(wù)服務(wù)類??梢詮倪@個(gè)類中獲取任務(wù)的信息。5.5:HistoryService是 activiti 的查詢歷史信息的類。在一個(gè)流程執(zhí)行完成后,這個(gè)對(duì)象為息。提供查詢歷史信5.6:ProsDefinition流程定義類??梢詮倪@里獲得資源文件等。5.7:ProsInstance代表流程定義的執(zhí)行實(shí)例。如一個(gè)流程實(shí)例包括了所有的運(yùn)行節(jié)點(diǎn)請(qǐng)了一天的假,她就必須發(fā)出一個(gè)流程實(shí)例的申請(qǐng)??梢岳眠@個(gè)對(duì)象來了

18、解當(dāng)前流程實(shí)例的進(jìn)度等信息。流程實(shí)例就表示一個(gè)流程從開始到結(jié)束的最大的流程分支,即一個(gè)流程中流程實(shí)例只有一個(gè)。5.8:ExecutionActiviti 用這個(gè)對(duì)象去描述流程執(zhí)行的每一個(gè)節(jié)點(diǎn)。在沒有并發(fā)的情況下,Execution 就是同 ProExecution。sInstance。流程按照流程定義的規(guī)則執(zhí)行一次的過程,就可以表示執(zhí)行對(duì)象如圖為 ProsInstance 的源代碼:從源代碼中可以看出 ProsInstance 就是 Execution。但在現(xiàn)實(shí)意義上有所區(qū)別:在單線流程中,如上圖的流程,ProsInstance 與 Execution 是一致的。這個(gè)例子有一個(gè)特點(diǎn):wire

19、money(匯錢)和 archive(存檔)是并發(fā)執(zhí)行的。這個(gè)時(shí) 候,總線路代表 Pro總結(jié):sInstance,而分線路中每個(gè)活動(dòng)代表 Execution。一個(gè)流程中,執(zhí)行對(duì)象可以存在多個(gè),但是流程實(shí)例只能有一個(gè)。當(dāng)流程按照規(guī)則只執(zhí)行一次的時(shí)候,那么流程實(shí)例就是執(zhí)行對(duì)象。6:oWorld 程序(模擬流程的執(zhí)行)6.1:流程圖:6.2:部署流程定義這里使用 ReitoryService 部署流程定義addClasspathResource 表示從類路徑下加載資源文件,一次只能加載一個(gè)文件6.3:啟動(dòng)流程實(shí)例這里使用 RuntimeService 啟動(dòng)流程實(shí)例6.4:查看個(gè)人任務(wù)這里使用 Tas

20、kService 完成任務(wù)的查詢6.5:完成個(gè)人任務(wù)這里使用 TaskService 完成任務(wù)的辦理7:管理流程定義7.1:設(shè)計(jì)流程定義文檔7.1.1:流程圖7.1.2:bpmn 文件BPMN 2.0根節(jié)點(diǎn)是 definitions 節(jié)點(diǎn)。這個(gè)元素中,可以定義多個(gè)流程定義(不過我們建議每個(gè)文件只包含一個(gè)流程定義, 可以簡化開發(fā)過程中的難度)。 一個(gè)空的流程定義看起來像下面這樣。注意,definitions 元素 最少也要包含 xmlns 和 Namespace的。Namespace 可以是任意值,它用來對(duì)流程實(shí)例進(jìn)行分類。說明:流程定義文檔有兩部分組成:1) bpmn 文件流程規(guī)則文件。在部署

21、后,每次系統(tǒng)啟動(dòng)時(shí)都會(huì)被,把內(nèi)容封裝成流程定義放入項(xiàng)目緩存中。Activiti 框架結(jié)合這個(gè) xml 文件自動(dòng)管理流程,流程的執(zhí)行就是按照 bpmn 文件定義的規(guī)則執(zhí)行的,bpmn 文件是給計(jì)算機(jī)執(zhí)行用的。2) 展示流程圖的在系統(tǒng)里需要展示流程的進(jìn)展,是給用戶看的。7.2:部署流程定義(classpath 路徑加載文件)說明:1)先獲取流程引擎對(duì)象:在創(chuàng)建時(shí)會(huì)自動(dòng)加載classpath 下的 activiti.cfg.xml2)首先獲得默認(rèn)的流程引擎,通過流程引擎獲取了一個(gè) ReitoryService 對(duì)象(倉庫對(duì)象)3)由倉庫的服務(wù)對(duì)象產(chǎn)生一個(gè)部署對(duì)象配置對(duì)象,用來封裝部署操作的相關(guān)配置。

22、4)這是一個(gè)鏈?zhǔn)骄幊蹋诓渴鹋渲脤?duì)象中設(shè)置顯示名,上傳流程定義規(guī)則文件5)向數(shù)據(jù)庫表中存放流程定義的規(guī)則信息。6)這一步在數(shù)據(jù)庫中將操作三:a) act_re_deployment(部署對(duì)象表)存放流程定義的顯示名和部署時(shí)間,每部署一次增加一條b) act_re_procdef(流程定義表)存放流程定義的屬性信息,部署每個(gè)新的流程定義都會(huì)在這增加一條。注意:當(dāng)流程定義的key 相同的情況下,使用的是版本升級(jí)c) act_ge_bytearray(資源文件表)流程定義相關(guān)的部署信息。即流程定義文檔的存放地。每部署一次就會(huì)增加兩條記錄,一條是關(guān)于 bpmn 規(guī)則文件的,一條是的(如果部署時(shí)只指定了

23、bpmn 一個(gè)文件,activiti 會(huì)在部署時(shí)bpmn 文件內(nèi)容自動(dòng)生成流程圖)。兩個(gè)文件不是很大,都是以二進(jìn)制形式在數(shù)據(jù)庫中。7.3:部署流程定義(zip 格式文件)將壓縮成 zip 格式的文件,使用 zip 的輸入流用作部署流程定義7.4:查看流程定義查詢流程定義的信息結(jié)果:再部署一次運(yùn)行結(jié)果為:可以看到流程定義的key 值相同的情況下,版本是從 1 開始逐次升級(jí)的流程定義的 Id 是【key:版本:生成 ID】說明:1)流程定義和部署對(duì)象相關(guān)的Service 都是 ReitoryService。2)創(chuàng)建流程定義查詢對(duì)象,可以在 ProsDefinitionQuery 上設(shè)置查詢的相關(guān)參

24、數(shù)3)調(diào)用 ProsDefinitionQuery 對(duì)象的 list 方法,執(zhí)行查詢,獲得符合條件的流程定義列表4)由運(yùn)行結(jié)果可以看出:Key 和 Name 的值為:bpmn 文件 pros 節(jié)點(diǎn)的 id 和name 的屬性值5)key 屬性被用來區(qū)別不同的流程定義。6)帶有特定 key 的流程定義第一次部署時(shí),ver本號(hào)上加 1為 1。之后每次部署都會(huì)在當(dāng)前最高版7)Id 的值的生成規(guī)則為:prosDefinitionKey:prosDefinitionVer:generated-id,這里的 generated-id 是一個(gè)自動(dòng)生成的唯一的數(shù)字8)重復(fù)部署一次,deploymentId 的

25、值以一定的形式變化規(guī)則act_ge_property 表生成7.5:刪除流程定義刪除部署到activiti 中的流程定義。說明:1) 因?yàn)閯h除的是流程定義,而流程定義的部署是屬于倉庫服務(wù)的,所以應(yīng)該先得到ReitoryService2) 如果該流程定義下沒有正在運(yùn)行的流程,則可以用普通刪除。如果是有關(guān)聯(lián)的信息,用級(jí)聯(lián)刪除。項(xiàng)目開發(fā)中使用級(jí)聯(lián)刪除的情況比較多,刪除操作一般只開放給超級(jí)管理員使用。7.6:獲取流程定義文檔的資源(查看流程圖附件)查詢出流程定義文檔。主要查的是,用于顯示流程用。說明:1)deploymentId 為流程部署 ID2)resourceName 為 act_ge_byte

26、array 表中NAME_列的值3)使用 reitoryService 的getDeploymentResourceNames 方法可以獲取指定部署下得所有文件的名稱4)使用 reitoryService 的getResourceAsStream 方法傳入部署 ID 和資源名稱可以獲取部署下指定名稱文件的輸入流5)最后的有關(guān) IO 流的操作,使用 FileUtils 工具的 copyInputStreamToFile 方法完成流程流程到文件的拷貝,將資源文件以流的形式輸出到指定文件夾下7.7:附加功能:查詢最新版本的流程定義7.8:附加功能:刪除流程定義(刪除 key 相同的所有不同版本的流程

27、定義)7.9:總結(jié)8:流程實(shí)例、任務(wù)的執(zhí)行8.1:流程圖Deployment部署對(duì)象1、一次部署的多個(gè)文件的信息。對(duì)于不需要的流程可以刪除和修改。2、對(duì)應(yīng)的表: act_re_deployment:部署對(duì)象表 act_re_procdef:流程定義表 act_ge_bytearray:資源文件表 act_ge_property:主鍵生成策略表ProsDefinition 流程定義1、.bpmn 后得到的流程定義規(guī)則的信息,工作流系統(tǒng)就是按照流程定義的規(guī)則執(zhí)行的。8.2:部署流程定義8.3:啟動(dòng)流程實(shí)例說明:1) 操作數(shù)據(jù)庫的 act_ru_execution 表,如果是用戶任務(wù)節(jié)點(diǎn),同時(shí)也會(huì)在

28、 act_ru_task 添加一條8.4:查詢個(gè)人任務(wù)說明:1)因?yàn)槭侨蝿?wù)查詢,所以從 prosEngine 中應(yīng)該得到TaskService2)使用 TaskService 獲取到任務(wù)查詢對(duì)象 TaskQuery3)為查詢對(duì)象添加查詢過濾條件,使用 taskAssignee 指定任務(wù)的辦理者(即查詢指定用戶的任務(wù)),同時(shí)可以添加分頁排序等過濾條件4)調(diào)用 list 方法執(zhí)行查詢,返回辦理者為指定用戶的任務(wù)列表5)任務(wù) ID、名稱、辦理人、創(chuàng)建時(shí)間可以從 act_ru_task 表中查到。6)Execution 與 Pro相當(dāng)于 ExecutionsInstance 見 5.6 和 5.7 章

29、節(jié)的介紹。在這種情況下,ProsInstance7)如果 assignee 屬性為部門經(jīng)理,結(jié)果為空。因?yàn)楝F(xiàn)在流程只到了”填寫請(qǐng)假申請(qǐng)”階段,后面的任務(wù)還沒有執(zhí)行,即在數(shù)據(jù)庫中沒有部門經(jīng)理可以辦理的任務(wù),所以查詢不到。8)一個(gè) Task 節(jié)點(diǎn)和 Execution 節(jié)點(diǎn)是 1 對(duì) 1 的情況,在 task 對(duì)象中使用 Execution_來表示他們之間的關(guān)系9)任務(wù) ID 在數(shù)據(jù)庫表 act_ru_task 中對(duì)應(yīng)“ID_”列附加:在 activiti 任務(wù)中,主要分為兩大類查詢?nèi)蝿?wù)(個(gè)人任務(wù)和組任務(wù)):1.確切指定了辦理者的任務(wù),這個(gè)任務(wù)將成為指定者的私有任務(wù),即個(gè)人任務(wù)。2.無法指定具體的

30、某一個(gè)人來辦理的任務(wù),可以把任務(wù)分配給幾個(gè)人或者一到 多個(gè)小組,讓這個(gè)范圍內(nèi)的用戶可以選擇性(空余時(shí)間時(shí))來辦理這類任務(wù),即組任務(wù)。先知道個(gè)人任務(wù)的查詢和辦理,組任務(wù)的操作后面講8.5:辦理任務(wù)說明:1)是辦理任務(wù),所以從 ProsEngine 得到的是 TaskService。2)當(dāng)執(zhí)行完這段代碼,再以員工的去執(zhí)行查詢的時(shí)候,會(huì)發(fā)現(xiàn)這個(gè)時(shí)候已經(jīng)沒有數(shù)據(jù)了,因?yàn)檎趫?zhí)行的任務(wù)中沒有數(shù)據(jù)。3)對(duì)于執(zhí)行完的任務(wù),activiti 將從act_ru_task 表中刪除該任務(wù),下一個(gè)任務(wù)會(huì)入進(jìn)來。4)以”部門經(jīng)理”的了。進(jìn)行查詢,可以查到結(jié)果。因?yàn)榱鞒虉?zhí)行到部門經(jīng)理審批這個(gè)節(jié)點(diǎn)5)再執(zhí)行辦理任務(wù)代碼,

31、執(zhí)行完以后以”部門經(jīng)理”進(jìn)行查詢,沒有結(jié)果。6)重復(fù)第 3 和 4 步直到流程執(zhí)行完。8.6:查詢流程狀態(tài)(判斷流程正在執(zhí)行,還是結(jié)束)在流程執(zhí)行的過程中,創(chuàng)建的流程實(shí)例 ID 在整個(gè)過程中都不會(huì)變,當(dāng)流程結(jié)束后,流程實(shí)例將會(huì)在正在執(zhí)行的執(zhí)行對(duì)象表中(act_ru_execution)被刪除說明:1)因?yàn)槭遣樵兞鞒虒?shí)例,所以先獲取 runtimeService2)創(chuàng)建流程實(shí)例查詢對(duì)象,設(shè)置實(shí)例 ID 過濾參數(shù)3)由于一個(gè)流程實(shí)例 ID 只對(duì)應(yīng)一個(gè)實(shí)例,使用 singleResult 執(zhí)行查詢返回一個(gè)唯一的結(jié)果,如果結(jié)果數(shù)量大于 1,則拋出異常4)判斷指定 ID 的實(shí)例是否存在,如果結(jié)果為空,則

32、代表流程結(jié)束,實(shí)例在正在執(zhí)行的執(zhí)行對(duì)象表中已被刪除,轉(zhuǎn)換成歷史數(shù)據(jù)。8.7:附加功能:查詢歷史任務(wù)(后面講)8.8:附加功能:查詢歷史流程實(shí)例(后面講)8.9:總結(jié)Execution執(zhí)行對(duì)象按流程定義的規(guī)則執(zhí)行一次的過程.對(duì)應(yīng)的表:act_ru_execution: 正在執(zhí)行的信息 act_hi_procinst:已經(jīng)執(zhí)行完的歷史流程實(shí)例信息 act_hi_actinst:存放歷史所有完成的活動(dòng)ProsInstance流程實(shí)例特指流程從開始到結(jié)束的那個(gè)最大的執(zhí)行分支,一個(gè)執(zhí)行的流程中,流程實(shí)例只有 1 個(gè)。注意如果是單例流程,執(zhí)行對(duì)象 ID 就是流程實(shí)例 ID如果一個(gè)流程有分支和聚合,那么執(zhí)行

33、對(duì)象 ID 和流程實(shí)例 ID 就不相同一個(gè)流程中,流程實(shí)例只有 1 個(gè),執(zhí)行對(duì)象可以存在多個(gè)。Task 任務(wù)執(zhí)行到某任務(wù)環(huán)節(jié)時(shí)生成的任務(wù)信息。對(duì)應(yīng)的表:act_ru_task:正在執(zhí)行的任務(wù)信息 act_hi_taskinst:已經(jīng)執(zhí)行完的歷史任務(wù)信息9:流程變量9.1:流程圖流程變量在整個(gè)工作流中扮演很重要的作用。例如:請(qǐng)假流程中有請(qǐng)假天數(shù)、請(qǐng)假原因等一些參數(shù)都為流程變量的范圍。流程變量的作用域范圍是只對(duì)應(yīng)一個(gè)流程實(shí)例。也就是說各個(gè)流程實(shí)例的流程變量是不相互影響的。流程實(shí)例結(jié)束完成以后流程變量還保存在數(shù)據(jù)庫中(存放到流程變量的歷史表中)。例如:即:9.2:部署流程定義說明:輸入流加載資源文件

34、的 3 種方式設(shè)置流程變量(名稱/值)獲取流程變量(針對(duì)流程變量的名稱,獲取流程變量的值經(jīng)理審批提交申請(qǐng)9.3:啟動(dòng)流程實(shí)例9.4:設(shè)置流程變量說明:1)流程變量的作用域就是流程實(shí)例,所以只要設(shè)置就行了,不用管在哪個(gè)階段設(shè)置2)基本類型設(shè)置流程變量,在 taskService 中使用任務(wù) ID,定義流程變量的名稱,設(shè)置流程變量的值。3)Javabean 類型設(shè)置流程變量,需要這個(gè) javabean 實(shí)現(xiàn)了 Serializable 接口4)設(shè)置流程變量的時(shí)候,向 act_ru_variable 這個(gè)表添加數(shù)據(jù)9.5:獲取流程變量說明:流程變量的獲取針對(duì)流程實(shí)例(即 1 個(gè)流程),每個(gè)流程實(shí)例獲

35、取的流程變量時(shí)不同的使用基本類型獲取流程變量,在 taskService 中使用任務(wù) ID,流程變量的名稱,獲取流程變量的值。3) Javabean 類型設(shè)置獲取流程變量,除了需要這個(gè) javabean 實(shí)現(xiàn)了 Serializable 接口外,還要求流程變量對(duì)象的屬性不能發(fā)生變化,否則拋出異常。解決方案,固定序列化 ID9.6:模擬流程變量的設(shè)置和獲取的場(chǎng)景說明:1) RuntimeService 對(duì)象可以設(shè)置流程變量和獲取流程變量 2) TaskService 對(duì)象可以設(shè)置流程變量和獲取流程變量 3) 流程實(shí)例啟動(dòng)的時(shí)候可以設(shè)置流程變量任務(wù)辦理完成的時(shí)候可以設(shè)置流程變量流程變量可以通過名稱

36、/值的形式設(shè)置單個(gè)流程變量流程變量可以通過 Map 集合,同時(shí)設(shè)置多個(gè)流程變量Map 集合的 key 表示流程變量的名稱Map 集合的 value 表示流程變量的值9.7:查詢歷史的流程變量說明:1)歷史的流程變量查詢,指定流程變量的名稱,查詢 act_hi_varinst 表(也可以針對(duì),流程實(shí)例 ID,執(zhí)行對(duì)象 ID,任務(wù) ID 查詢)9.8:流程變量的支持的類型如圖是從官網(wǎng)列出來的流程變量的類型:從圖中可以看出包括了大部分封裝類型和 Date、String 和實(shí)現(xiàn)了Serializable 接口的類的類型。9.9:總結(jié)1:流程變量2:擴(kuò)展知識(shí):setVariable 和 setVaria

37、bleLocal 的區(qū)別10:流程執(zhí)行歷史10.1:查詢歷史流程實(shí)例查找按照某個(gè)流程定義的規(guī)則一共執(zhí)行了多少次流程2:還有,使用 setVariableLocal 說明流程變量綁定了當(dāng)前的任務(wù),當(dāng)流程繼續(xù)執(zhí)行時(shí),下個(gè)任務(wù)獲取不到這個(gè)流程變量(因?yàn)檎趫?zhí)行的流程變量中沒有這個(gè)數(shù)據(jù)),所有查詢正在執(zhí)行的任務(wù)時(shí)不能查詢到 需要的數(shù)據(jù),此時(shí)需要查詢歷史的流程變量。setVariable:設(shè)置流程變量的時(shí)候,流程變量名稱相同的時(shí)候,后一次的值替換前一次的值,而且可以看到 TASK_ID 的字段不會(huì)存放任務(wù) ID 的值setVariableLocal:1:設(shè)置流程變量的時(shí)候,針對(duì)當(dāng)前活動(dòng)的節(jié)點(diǎn)設(shè)置流程變量

38、,如果一個(gè)流程中存在 2 個(gè)活動(dòng)節(jié)點(diǎn),對(duì)每個(gè)活動(dòng)節(jié)點(diǎn)都設(shè)置流程變量,即使流程變量的名稱相同,后一次的版本的值也不會(huì)替換前一次版本的值,它會(huì)使用不同的任務(wù) ID 作為標(biāo)識(shí),存放 2 個(gè)流程變量值,而且可以看到 TASK_ID 的字段會(huì)存放任務(wù) ID 的值例如 act_hi_varinst 表的數(shù)據(jù):不同的任務(wù)節(jié)點(diǎn),即使流程變量名稱相同,存放的值也是不同的。如圖:在流程執(zhí)行或者任務(wù)執(zhí)行的過程中,用于設(shè)置和獲取變量,使用流程變量在流程傳遞的過程中傳遞業(yè)務(wù)參數(shù)。對(duì)應(yīng)的表:act_ru_variable:正在執(zhí)行的流程變量表 act_hi_varinst:流程變量歷史表10.2:查詢歷史活動(dòng)某一次流程的

39、執(zhí)行一共經(jīng)歷了多少個(gè)活動(dòng)10.3:查詢歷史任務(wù)某一次流程的執(zhí)行一共經(jīng)歷了多少個(gè)任務(wù)10.4:查詢歷史流程變量某一次流程的執(zhí)行一共設(shè)置的流程變量10.5:總結(jié)由于數(shù)據(jù)庫中保存著歷史信息以及正在運(yùn)行的流程實(shí)例信息,在實(shí)際項(xiàng)目中對(duì)已完成任務(wù)的查看頻率遠(yuǎn)不及對(duì) 和可接任務(wù)的查看,所以在 activiti 采用分開管理,把正在運(yùn)行的交給 RuntimeService、TaskService 管理,而歷史數(shù)據(jù)交給 HistoryService 來管理。這樣做的好處在于,加快流程執(zhí)行的速度,因?yàn)檎趫?zhí)行的流程的表中數(shù)據(jù)不會(huì)很大。二:Activiti 第二天11:連線11.1:流程圖注意:如果將流程圖放置在和

40、 java 類相同的路徑,需要配置:11.2:部署流程定義+啟動(dòng)流程實(shí)例11.3:查詢個(gè)人任務(wù)11.4:完成任務(wù)說明:1)使用流程變量,設(shè)置連線需要的流程變量的名稱message,并設(shè)置流程變量的值對(duì)應(yīng):流程會(huì)按照指定的連線完成任務(wù)。11.5:總結(jié)1、一個(gè)活動(dòng)中可以指定一個(gè)或多個(gè)SequenceFlow(Start 中有一個(gè),End 中沒有)。*開始活動(dòng)中有一個(gè) SequenceFlow 。結(jié)束活動(dòng)中沒有SequenceFlow 。其他活動(dòng)中有 1 條或多條SequenceFlow2、如果只有一個(gè),則可以不使用流程變量設(shè)置codition 的名稱;如果有多個(gè),則需要使用流程變量設(shè)置 codit

41、ion 的名稱。message 表示流程變量的名稱,不重要表示流程變量的值,$中間的內(nèi)容要使用行的連線。類型的表達(dá)式,用來判斷應(yīng)該執(zhí)12:排他網(wǎng)關(guān)(ExclusiveGateWay)12.1:流程圖12.2:部署流程定義+啟動(dòng)流程實(shí)例12.3:查詢個(gè)人任務(wù)12.4:完成個(gè)人任務(wù)說明:1)一個(gè)排他網(wǎng)關(guān)對(duì)應(yīng)一個(gè)以上的順序流2)由排他網(wǎng)關(guān)流出的順序流都有個(gè) conditionExpres型的決策結(jié)果。元素,在內(nèi)部返回類3)決策網(wǎng)關(guān)只會(huì)返回一條結(jié)果。當(dāng)流程執(zhí)行到排他網(wǎng)關(guān)時(shí),流程引擎會(huì)自動(dòng)檢索網(wǎng)關(guān)出口,從上到下檢索如果發(fā)現(xiàn)第一條決策結(jié)果為 true 或者沒有設(shè)置條件的(默認(rèn)為成立),則流出。4)如果沒有

42、任何一個(gè)出口符合條件,則拋出異常5)使用流程變量,設(shè)置連線的條件,并按照連線的條件執(zhí)行工作流,如果沒有條件符合的條件,則以默認(rèn)的連線離開。例如:則執(zhí)行連線:如果使用流程變量設(shè)置則執(zhí)行連線:13:并行網(wǎng)關(guān)(parallelGateWay)13.1:流程圖13.2:部署流程定義+啟動(dòng)流程實(shí)例13.3:查詢個(gè)人任務(wù)13.4:完成個(gè)人任務(wù)說明:一個(gè)流程中流程實(shí)例只有 1 個(gè),執(zhí)行對(duì)象有多個(gè)并行網(wǎng)關(guān)的功能是基于進(jìn)入和外出的順序流的:3) 并行網(wǎng)關(guān)的進(jìn)入和外出都是使用相同節(jié)點(diǎn)標(biāo)識(shí)4) 如果同一個(gè)并行網(wǎng)關(guān)有多個(gè)進(jìn)入和多個(gè)外出順序流,它就同時(shí)具有分支和匯聚功能。這時(shí),網(wǎng)關(guān)會(huì)先匯聚所有進(jìn)入的順序流,然后再切分成

43、多個(gè)并行分支。5) 并行網(wǎng)關(guān)不會(huì)條件。 即使順序流中定義了條件,也會(huì)被忽略。分支(fork): 并行后的所有外出順序流,為每個(gè)順序流都創(chuàng)建一個(gè)并發(fā)分支。匯聚(join): 所有到達(dá)并行網(wǎng)關(guān),在此等待的進(jìn)入分支, 直到所有進(jìn)入順序流的分支都到達(dá)以后, 流程就會(huì)通過匯聚網(wǎng)關(guān)。6) 并行網(wǎng)關(guān)不需要是“平衡的”(比如, 對(duì)應(yīng)并行網(wǎng)關(guān)的進(jìn)入和外出節(jié)點(diǎn)數(shù)目不一定相等)。如圖中標(biāo)示是合法的:14:開始活動(dòng)節(jié)點(diǎn)14.1:流程圖14.2:部署流程定義+啟動(dòng)流程實(shí)例+查詢流程實(shí)例+查詢歷史流程實(shí)例14.3:總結(jié)15:接收活動(dòng)(receiveTask,即等待活動(dòng))接收任務(wù)是一個(gè)簡單任務(wù),它會(huì)等待對(duì)應(yīng)消息的到達(dá)。 當(dāng)

44、前,的 java 語義。 當(dāng)流程達(dá)到接收任務(wù),流程狀態(tài)會(huì)保存到數(shù)據(jù)庫中。只實(shí)現(xiàn)了這個(gè)任務(wù)在任務(wù)創(chuàng)建后,意味著流程會(huì)進(jìn)入等待狀態(tài), 直到引擎接收了一個(gè)特定的消息, 這會(huì)觸發(fā)流程穿過接收任務(wù)繼續(xù)執(zhí)行。:結(jié)束節(jié)點(diǎn)沒有出口:其他節(jié)點(diǎn)有一個(gè)或多個(gè)出口。如果有一個(gè)出口,則代表是一個(gè)單線流程;如果有多個(gè)出口,則代表是開啟并發(fā)流程。15.1:流程圖15.2:部署流程定義+啟動(dòng)流程實(shí)例/*ReceiceTask任務(wù),機(jī)器自動(dòng)完成的任務(wù)只會(huì)在act_ru_execution表中產(chǎn)生一條數(shù)據(jù)throws Exception*/Testpublic void testExecution() throws Except

45、ion / 1 發(fā)布流程InputStream inputStreamBpmn =this.getClass().getResourceAsStream(receiveTask.bpmn); InputStream inputStreamPng =this.getClass().getResourceAsStream(receiveTask.png); prosEngine.getReitoryService()/.createDeployment()/.addInputStream(receiveTask.bpmn, inputStreamBpmn)/.addInputStream(rece

46、iveTask.png, inputStreamPng)/.deploy();/ 2 啟動(dòng)流程ProsInstanc= prosEngine.getRuntimeService()/.startProsInstanceByKey(receiveTaskDemo); System.out.prln(: + pi.getId();String= pi.getId();/ 3查詢是否有一個(gè)執(zhí)行對(duì)象在描述”匯總當(dāng)日銷售額“說明:1) 當(dāng)前任務(wù)(一般指機(jī)器自動(dòng)完成,但需要耗費(fèi)一定時(shí)間的工作)完成后,向后推移流程,可以調(diào)用runtimeServiignal(executionId),傳遞接收?qǐng)?zhí)行對(duì)象的 i

47、d。Execution e1 = prosEngine.getRuntimeService()/.createExecutionQuery()/.prosInstanceId()/.activityId(匯總當(dāng)日銷售額)/.singleResult();/ 4執(zhí)行一堆邏輯,并設(shè)置流程變量Map vars = new HashMap(); vars.put(當(dāng)日銷售額, 10000);/ 5流程向后執(zhí)行一步:往后推移e1,使用signal給流程引擎信號(hào),當(dāng)前任務(wù)已經(jīng)完成了,可以往后執(zhí)行prosEngine.getRuntimeService().signal(e1.getId(),vars);/

48、 6判斷當(dāng)前流程是否在”給發(fā)“節(jié)點(diǎn)Execution e2 = prosEngine.getRuntimeService()/.createExecutionQuery()/.prosInstanceId()/.activityId(給總經(jīng)理發(fā))/.singleResult();/ 7獲取流程變量eger money = (eger) prosEngine.getRuntimeService()/.getVariable(e2.getId(), 當(dāng)日銷售額);System.out.prln(,賺了 +money);/ 8向后執(zhí)行一步:任務(wù)完成,往后推移”給發(fā)“任務(wù)prosEngine.getR

49、untimeService()/.signal(e2.getId();/ 9查詢流程狀態(tài)pi = prosEngine.getRuntimeService()/.createProsInstanceQuery()/.prosInstanceId()/.singleResult();if(pi=null)System.out.prln(流程正常執(zhí)行!,已經(jīng)結(jié)束了);16:用戶任務(wù)(userTask,即用戶操作的任務(wù))16.1:個(gè)人任務(wù)16.1.1:流程圖16.1.2::分配個(gè)人任務(wù)方式一(直接指定辦理人)1:流程圖中任務(wù)節(jié)點(diǎn)的配置2:測(cè)試代碼:ProsEngine prosEngine = Pr

50、osEngines.getDefaultProsEngine();/部署流程定義,啟動(dòng)流程實(shí)例Testpublic void testTask() throws Exception / 1 發(fā)布流程InputStream inputStreamBpmn =說明:1)是個(gè)人任務(wù)的辦理人this.getClass().getResourceAsStream(taskPros.bpmn); InputStream inputStreamPng =this.getClass().getResourceAsStream(taskPros.png); prosEngine.getReitoryServic

51、e()/.createDeployment()/.addInputStream(userTask.bpmn, inputStreamBpmn)/.addInputStream(userTask.png, inputStreamPng)/.deploy();/ 2 啟動(dòng)流程/啟動(dòng)流程實(shí)例的同時(shí),設(shè)置流程變量ProsInstanc= prosEngine.getRuntimeService()/.startProsInstanceByKey(taskPros); System.out.prln(: + pi.getId();/查詢個(gè)人任務(wù)列表Testpublic void findMyTaskLi

52、st() String userId = ;List list = prosEngine.getTaskService()/.createTaskQuery()/.taskAssignee(userId)/指定個(gè)人任務(wù)查詢.list();for(Task task:list )System.out.prln(id=+task.getId(); System.out.prln(name=+task.getName(); System.out.prln(assinee=+task.getAssignee();System.out.prln(createTime=+task.getCreateTim

53、e();System.out.prln(executionId=+task.getExecutionId();/完成任務(wù)Testpublic void completeTask() String taskId = 3209;prosEngine.getTaskService()/.complete(taskId);/ System.out.prln(完成任務(wù));2) 但是這樣分配任務(wù)的辦理人不夠靈活,因?yàn)轫?xiàng)目開發(fā)中任務(wù)的辦理人不要放置 XML 文件中。16.1.3::分配個(gè)人任務(wù)方式二(使用流程變量)1:流程圖中任務(wù)節(jié)點(diǎn)的配置2:測(cè)試代碼ProsEngine prosEngine = Pros

54、Engines.getDefaultProsEngine();/部署流程定義,啟動(dòng)流程實(shí)例Testpublic void testTask() throws Exception / 1 發(fā)布流程InputStream inputStreamBpmn =this.getClass().getResourceAsStream(taskPros.bpmn); InputStream inputStreamPng =this.getClass().getResourceAsStream(taskPros.png); prosEngine.getReitoryService()/.createDeplo

55、yment()/.addInputStream(userTask.bpmn, inputStreamBpmn)/.addInputStream(userTask.png, inputStreamPng)/.deploy();/ 2 啟動(dòng)流程/啟動(dòng)流程實(shí)例的同時(shí),設(shè)置流程變量Map variables = new HashMap(); variables.put(userID, );ProsInstanc= prosEngine.getRuntimeService()/.startProsInstanceByKey(taskPros,variables); System.out.prln(: +

56、 pi.getId();/查詢個(gè)人任務(wù)列表Test說明:1)是個(gè)人任務(wù)的辦理人2) 在開發(fā)中,可以在頁面中指定下一個(gè)任務(wù)的辦理人,通過流程變量設(shè)置下一個(gè)任務(wù)的辦理人16.1.4::分配個(gè)人任務(wù)方式三(使用類)1:流程圖中任務(wù)節(jié)點(diǎn)的配置public void findMyTaskList() String userId = ;List list = prosEngine.getTaskService()/.createTaskQuery()/.taskAssignee(userId)/指定個(gè)人任務(wù)查詢.list();for(Task task:list )System.out.prln(id=+

57、task.getId(); System.out.prln(name=+task.getName(); System.out.prln(assinee=+task.getAssignee();System.out.prln(createTime=+task.getCreateTime(); System.out.prln(executionId=+task.getExecutionId();/完成任務(wù)Testpublic void completeTask() String taskId = 3209;prosEngine.getTaskService()/.complete(taskId);

58、/ System.out.prln(完成任務(wù));此時(shí)流程圖的 XML 文件,如圖:2:TaskListenerImpl 類,用來設(shè)置任務(wù)的辦理人3:測(cè)試代碼ProsEngine prosEngine = ProsEngines.getDefaultProsEngine();/部署流程定義,啟動(dòng)流程實(shí)例Testpublic void testTask() throws Exception / 1 發(fā)布流程InputStream inputStreamBpmn =this.getClass().getResourceAsStream(taskPros.bpmn); InputStream inpu

59、tStreamPng =this.getClass().getResourceAsStream(taskPros.png); prosEngine.getReitoryService()/.createDeployment()/.addInputStream(userTask.bpmn, inputStreamBpmn)/public class TaskListenerImpl implements TaskListener /*指定個(gè)人任務(wù)和組任務(wù)的辦理人*/ Overridepublic void notify(DelegateTask delegateTask) String assi

60、gnee = ;/指定個(gè)人任務(wù)delegateTask.setAssignee(assignee);.addInputStream(userTask.png, inputStreamPng)/.deploy();/ 2 啟動(dòng)流程ProsInstanc= prosEngine.getRuntimeService()/.startProsInstanceByKey(taskPros);System.out.prln(: + pi.getId();/查詢個(gè)人任務(wù)列表Testpublic void findMyTaskList()String userId = List list = pro;sEng

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論