Activiti流程實(shí)例_第1頁(yè)
Activiti流程實(shí)例_第2頁(yè)
Activiti流程實(shí)例_第3頁(yè)
Activiti流程實(shí)例_第4頁(yè)
Activiti流程實(shí)例_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1重要概念掃盲1.1前言    從本篇文章我們開始介紹工作流框架activiti的相關(guān)知識(shí),不過在介紹activiti的知識(shí)之前,我們很有必要對(duì)工作流的一些基本概念進(jìn)行了解。1.1.1工作流重要概念 Workflow     Workflow(工作流)是“業(yè)務(wù)過程的部分或整體在計(jì)算機(jī)應(yīng)用環(huán)境下的自動(dòng)化,是對(duì)工作流程及其各操作步驟之間業(yè)務(wù)規(guī)則的抽象、概括描述”,它主要解決的是“使在多個(gè)參與者之間按照一種提前定義好的規(guī)則流程來(lái)傳遞與執(zhí)行文檔、信息或任務(wù)的過程,讓這個(gè)過程可以自動(dòng)進(jìn)行或者部分自動(dòng)執(zhí)行,從而完成預(yù)期的業(yè)務(wù)目標(biāo)”。 W

2、fMC     提到工作流就不能不提到工作流管理聯(lián)盟(WfMC,WorkflowManagementCoalition),它是一個(gè)由涉及工作流和業(yè)務(wù)流程管理的推廣學(xué)者(adopters)、開發(fā)工程師、顧問、分析師、大學(xué)和研究團(tuán)體的全球性組織,它的成立,標(biāo)志著工作流技術(shù)開始進(jìn)入相對(duì)成熟的階段。該組織創(chuàng)建并完善了工作流管理系統(tǒng)的相關(guān)術(shù)語(yǔ)、體系結(jié)構(gòu)及應(yīng)用編程接口等方面制定了一系列標(biāo)準(zhǔn),是唯一的致力于工作流標(biāo)準(zhǔn)的專業(yè)組織。 WfMS     接下來(lái)要說(shuō)的是工作流管理系統(tǒng)(WorkflowManagement System,WfMS)

3、,它完成了工作量的定義和管理,并按照在系統(tǒng)中預(yù)先定義好的工作流規(guī)則進(jìn)行工作流實(shí)例的執(zhí)行的軟件系統(tǒng),這里要說(shuō)明一下的是,并不是我們企業(yè)自己的系統(tǒng)應(yīng)用了工作流就是工作流管理系統(tǒng)了,工作流管理系統(tǒng)不是企業(yè)的業(yè)務(wù)系統(tǒng),而是為企業(yè)的業(yè)務(wù)系統(tǒng)的運(yùn)行提供了一個(gè)軟件的支撐環(huán)境。WfMS被用來(lái)定義、管理和執(zhí)行工作流程,它的目標(biāo)是管理工作的流程以確保工作在正確的時(shí)間被期望的人員所執(zhí)行。同時(shí)也可以在自動(dòng)化進(jìn)行的業(yè)務(wù)過程中插入人工的執(zhí)行和干預(yù)。 WfMS與工作流框架     WfMS我一般習(xí)慣于稱它為工作流框架,常見的工作流框Activiti、JBPM、OSWorkflow、A

4、ctiveBPEL、YAWL等。  1.1.2工作流引擎     個(gè)人覺得直接理解工作流引擎概念有點(diǎn)難度,我們可以先通過了解工作流引擎的職責(zé)再反過來(lái)理解工作流引擎,工作流引擎一般都做兩件事情:    1.定義流程,也就是給我們提供某種規(guī)范來(lái)定義規(guī)則,以及如何定義一個(gè)流程的這種規(guī)范,同事我們可以根據(jù)工作流引擎提供的相關(guān)概念來(lái)定義更為復(fù)雜的流程,這就是工作流引擎做的第一件事叫做定義流程。    2.執(zhí)行流程,也就是工作流引擎需要解釋這個(gè)規(guī)則,還要負(fù)責(zé)流程,它相當(dāng)于流程的調(diào)度者,監(jiān)控每個(gè)流程的執(zhí)行情況,并將流程

5、操作發(fā)往下一步,或者根據(jù)條件休眠或終止流程的這么一個(gè)過程就叫做執(zhí)行流程。     了解完工作流引擎的這兩個(gè)職責(zé),我相信對(duì)于什么是工作流引擎一定已經(jīng)有了一定的認(rèn)識(shí)了,我們?cè)谟靡痪渖晕⒂悬c(diǎn)官方的話來(lái)總結(jié)一下工作流引擎,工作流引擎為我們提供相關(guān)規(guī)則概念的定義,給我們提供了相關(guān)的API來(lái)調(diào)用這個(gè)引擎去執(zhí)行流程。流程的操作實(shí)際上就是工作流引擎提供相關(guān)的api我們?nèi)フ{(diào)用它。 工作流框架與工作流引擎     上面我們提及了常見了幾個(gè)工作流框架,其中現(xiàn)在的Activiti和JBPM5.0之前的版本都是基于ProcessEngine 工作流引

6、擎的工作流框架;JBPM5.0開始是基于DroolsFlow為工作流引擎的工作流框架;其中OSWorkflow是以工作流引擎命名的工作流框架,所以O(shè)SWorkflow是基于OSWorkflow工作流引擎的工作流框架;ActiveBPEL是基于工作流BPEL引擎的工作流框架.     到這里關(guān)于工作流的相關(guān)概念就介紹完了,接下來(lái)我們先了解一下我們的主角activiti的前世今生。  1.1.3 Activiti前世今生     Activiti 的創(chuàng)始人是  Tom Baeyens 說(shuō)到Tom B

7、aeyens 就不能不提他與jbpm的淵源。TomBaeyens 是 jBPM 的創(chuàng)始人,在 2002年,Tom Baeyens創(chuàng)建了基于狀態(tài)機(jī)原理的jBPM流程引擎。jBPM經(jīng)過了JBoss和Redhat公司之后,發(fā)展到了 jBPM 4。由于jBPM使用的是 GPL開源協(xié)議,并且與JBoss和Redhat公司的其他產(chǎn)品線結(jié)合的越來(lái)越緊密,對(duì)jBPM在更廣泛的范圍使用形成了阻礙。JBoss內(nèi)部對(duì)jBPM未來(lái)版本的架構(gòu)實(shí)現(xiàn)產(chǎn)生了嚴(yán)重的意見分歧,在2005年 Tom Baeyens離開了JBoss公司加入了Alfresco 公司,創(chuàng)建了使用Apache based-license V2的

8、、獨(dú)立于Alfresco產(chǎn)品的開源流程產(chǎn)品Activiti 。Activiti在2010年3月份開始啟動(dòng),到了2010年12月份正式發(fā)布第一個(gè)版本,新的基于jBPM4的開源工作流系統(tǒng)Activiti 5.0  !所以說(shuō)Activiti5是在jBPM 3、jBPM 4的基礎(chǔ)上發(fā)展而來(lái)的,是原jBPM 的延續(xù)。 Activiti 與jBPM 5的比較     jBPM 5則與之前的jBPM3、jBPM 4沒有太大關(guān)聯(lián),且舍棄了備受推崇的PVM(流程虛擬機(jī))思想,轉(zhuǎn)而選擇jBoss自身產(chǎn)品DroolsFlow作為流程引擎

9、的核心實(shí)現(xiàn),工作流最為重要的“人機(jī)交互”任務(wù)(類似于審批活動(dòng))則由單獨(dú)的一塊“Human Task Service”附加到DroolsFlow上實(shí)現(xiàn),任務(wù)的查詢、處理等行為通過Apache Mina異步通信機(jī)制完成。 序號(hào)技術(shù)組成ActivitijBPM51數(shù)據(jù)庫(kù)持久層ORMMyBatis3Hibernate32持久化標(biāo)準(zhǔn)無(wú)JPA規(guī)范3事務(wù)管理MyBatis機(jī)制/spring事務(wù)控制Bitronix,基于JTA事務(wù)管理4數(shù)據(jù)庫(kù)連接方式Jdbc/DataSourceJdbc/DataSource5支持?jǐn)?shù)據(jù)庫(kù)Oracle、SQL Server、MySQL等多數(shù)數(shù)據(jù)庫(kù)Oracle、SQL

10、Server、MySQL等多數(shù)數(shù)據(jù)庫(kù)6設(shè)計(jì)模式Command模式、觀察者模式等無(wú)7內(nèi)部服務(wù)通訊Service間通過API調(diào)用基于Apache Mina異步通訊8集成接口SOAP、Mule、RESTful消息通訊9支持的流程格式BPMN2、xPDL、jPDL等目前僅只支持BPMN2 xml10引擎核心PVM(流程虛擬機(jī))Drools11技術(shù)前身jBPM3、jBPM4Drools Flow12所屬公司AlfrescojB     從表格中的比較我們可以看出,Activiti最大的優(yōu)勢(shì)是采用了PVM(流程虛擬機(jī)),支持除了BPMN2.0規(guī)范之外的流程格式,

11、與外部服務(wù)有良好的集成能力,延續(xù)了jBPM3、jBPM4良好的社區(qū)支持,服務(wù)接口清晰,鏈?zhǔn)紸PI更為優(yōu)雅;劣勢(shì)是持久化層沒有遵循JPA規(guī)范。     jBPM最大的優(yōu)勢(shì)是采用了ApacheMina異步通信技術(shù),采用JPA/JTA持久化方面的標(biāo)準(zhǔn),以功能齊全的Guvnor作為流程倉(cāng)庫(kù),有RedHat(jB被紅帽收購(gòu))的專業(yè)化支持;但其劣勢(shì)也很明顯,對(duì)自身技術(shù)依賴過緊且目前僅支持BPMN2。     我們對(duì)Activiti和jBPM進(jìn)行比較目的是為了讓我們可以對(duì)他們的特性更加的了解,只有了解了他們的特性以后,這樣當(dāng)我們遇到具

12、體的項(xiàng)目時(shí)就可以根據(jù)需要來(lái)選用適合的工作流框架。 1.2總結(jié)     我們這篇文章主要介紹了工作流相關(guān)的基本概念,同時(shí)又了解了Activiti的前世今生,最后將Activiti與jBPM進(jìn)行了比較。2 Activiti整體認(rèn)識(shí)2.1前言     在上一篇文章中我們將工作流的相關(guān)概念、activiti的前世今生、activiti與jbpm的比較進(jìn)行學(xué)習(xí),這篇文章我們正式進(jìn)行activiti的學(xué)習(xí),activiti的整個(gè)學(xué)習(xí)我們主要通過例子的形式來(lái)理解。今天我們主要是準(zhǔn)備下activiti的環(huán)境,在數(shù)據(jù)庫(kù)中創(chuàng)建activiti默

13、認(rèn)的23張表以及activiti核心對(duì)象ProcessEngine最后是一個(gè)activiti的簡(jiǎn)單demo。2.2 環(huán)境準(zhǔn)備     相關(guān)軟件及版本:     jdk版本:Jdk1.8    IDE:eclipse    數(shù)據(jù)庫(kù):MySQL    Activiti:5.13     eclipse中安裝流程設(shè)計(jì)器插件:     eclipse打開help->install new software,單擊add:

14、     Name: Activiti BPMN2.0 designer     Location:/designer/update/ 進(jìn)行安裝即可。     引入jar包:     $Activiti_HOME/install/activiti-5.13/libs(activiti相關(guān)包)+mysql對(duì)應(yīng)驅(qū)動(dòng)包(mysql-connector-Java.jar)     jar包引入完畢后,我們環(huán)境

15、就準(zhǔn)備的差不多了,往下我們就該創(chuàng)建我們activiti數(shù)據(jù)庫(kù)默認(rèn)的表了。2.3 創(chuàng)建activiti表     在activiti中,相對(duì)于前身jbpm基礎(chǔ)上又額外多了5張表,所有現(xiàn)在的activiti框架默認(rèn)提供了23張表。所以第一步我們就來(lái)創(chuàng)建這23張表。 方法1:使用代碼來(lái)創(chuàng)建activiti工作流的表 java view plain copy1. 方法1:使用代碼來(lái)創(chuàng)建activiti工作流的表  2.   3. / 使用代碼創(chuàng)建工作流需要的23張表 

16、60;4. Test  5. public void createTable()   6.     / 工作流引擎的全部配置  7.     ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration  8.     

17、60;       .createStandaloneProcessEngineConfiguration();  9.   10.     / 鏈接數(shù)據(jù)的配置  11.     processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");  12.  &#

18、160;  processEngineConfiguration  13.             .setJdbcUrl("jdbc:mysql:/localhost:3306/activiti1?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8");  14.   

19、60; processEngineConfiguration.setJdbcUsername("root");  15.     processEngineConfiguration.setJdbcPassword("123456");  16.    17.     /* 18.      * public stat

20、ic final String DB_SCHEMA_UPDATE_FALSE = "false" 19.      * 不能自動(dòng)創(chuàng)建表,需要表存在 public static final String DB_SCHEMA_UPDATE_CREATE_DROP 20.      * = "create-drop"

21、; 先刪除表再創(chuàng)建表 public static final String 21.      * DB_SCHEMA_UPDATE_TRUE = "true"如果表不存在,自動(dòng)創(chuàng)建表 22.      */  23.     /如果表不存在,自動(dòng)創(chuàng)建表  24.    

22、 processEngineConfiguration  25.             .setDatabaseSchemaUpdate(processEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);  26.     / 工作流的核心對(duì)象,ProcessEnginee對(duì)象  27.    

23、; ProcessEngine processEngine = processEngineConfiguration  28.             .buildProcessEngine();  29.     System.out.println(processEngine);  30.   31.  

24、 32.       代碼執(zhí)行完畢,我們通過navicat查看數(shù)據(jù)庫(kù)會(huì)發(fā)現(xiàn),創(chuàng)建了一個(gè)新的數(shù)據(jù)庫(kù)activiti1,并且還有23張表。  方式2:使用配置文件來(lái)創(chuàng)建activiti的表     在類路徑下創(chuàng)建Activiti.cfg.xml文件,文件內(nèi)容為:java view plain copy1. <beans xmlns="/schema/beans"  2

25、.     xmlns:context="/schema/context" xmlns:tx="/schema/tx"  3.     xmlns:xsi="/2001/XMLSchema-instance"  4.    

26、0;xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd  5. /schema/context /schema/context/spring-context-2.5.xsd  6. http:/www.springfra

27、/schema/tx /schema/tx/spring-tx-3.0.xsd">  7.   8.   9.     <bean id="processEngineConfiguration"  10.         class="org.act

28、iviti.engine.impl.cfg.StandaloneProcessEngineConfiguration">  11.         <!- 連接數(shù)據(jù)的配置 ->  12.         <property name="jdbcDriver" value="com.mysql.j

29、dbc.Driver"></property>  13.         <property name="jdbcUrl"  14.             value="jdbc:mysql:/localhost:3306/activiti1?createDatabaseIfNotE

30、xist=true&useUnicode=true&characterEncoding=utf8"></property>  15.         <property name="jdbcUsername" value="root"></property>  16.        

31、; <property name="jdbcPassword" value="123456"></property>  17.         <!- 沒有表創(chuàng)建表 ->  18.         <property name="databaseS

32、chemaUpdate" value="true"></property>  19.     </bean>  20.   21. </beans>      通過代碼來(lái)加載配置文件中內(nèi)容:java view plain copy1. /* 2.  * 使用配置文件來(lái)創(chuàng)建數(shù)據(jù)庫(kù)中的表 3.  */ 

33、; 4. Test  5. public void createTable_2()   6.     /通過讓工作流引擎的全部配置對(duì)象來(lái)執(zhí)行配置文件中的內(nèi)容來(lái)創(chuàng)建流程引擎對(duì)象  7.     ProcessEngine processEngine = ProcessEngineConfiguration  8.     

34、0;       .createProcessEngineConfigurationFromResource(  9.                     "activiti.cfg.xml").buildProcessEngine();  10.  &#

35、160;  System.out.println("processEngine" + processEngine);  11.   運(yùn)行產(chǎn)生的結(jié)果與第一種是一樣的,其中這一種通過配置文件的方式是用的是比第一種多的。 連接數(shù)據(jù)庫(kù)url寫法:     無(wú)論是通過代碼還是通過xml文件來(lái)創(chuàng)建工作流的表,里面都涉及到一個(gè)知識(shí)點(diǎn)就是mysql的url的寫法,我們進(jìn)行下小結(jié):     #autoReconnect當(dāng)數(shù)據(jù)庫(kù)連接丟失時(shí)是否自動(dòng)

36、連接,取值true/false 缺省為false    #maxReconnects如果autoReconnect為true,此參數(shù)為重試次數(shù),缺省為3次     #initialTimeout如果autoReconnect為true,此參數(shù)為重新連接前等待的秒數(shù)缺省為2    #maxRows設(shè)置查詢時(shí)返回的行數(shù),0表示全部缺省為0    #useUnicode是否使用unicode輸出,true/false缺省為false    #characterEncoding如果useUni

37、code,該參數(shù)制定encoding類型,建議使用utf8缺省為無(wú)    #createDatabaseIfNotExist當(dāng)JDBC連接指定數(shù)據(jù)庫(kù),如果此數(shù)據(jù)庫(kù)不存在,此參數(shù)值為true時(shí),則自動(dòng)創(chuàng)建此數(shù)據(jù)庫(kù)     下面是一個(gè)url的例子:java view plain copy1. jdbc:mysql:/localhost:3306/ourmysql?  2. createDatabaseIfNotExist=true&  3. amp;useUnicode=true&

38、amp;  4. amp;characterEncoding=utf8&  5. amp;autoReconnect=true&  6. amp;useLocalSessionState=true  2.4 核心對(duì)象ProcessEngine     數(shù)據(jù)庫(kù)里的表創(chuàng)建完畢,接下來(lái)我們講述activiti里面的核心對(duì)象ProcessEngine。     ProcessEngine類,一般稱為流程引擎類,沒錯(cuò),這個(gè)流程引擎就是我們上一篇文章中

39、提到的流程引擎,它是activiti中最核心的類,并且這個(gè)類是線程安全的,所有的線程和請(qǐng)求都可以使用同一個(gè)ProcessEngine對(duì)象,其它常用類幾乎也都是由它而來(lái)的。 得到ProcessEngine對(duì)象:     方式1:使用classpath根目錄下的默認(rèn)配置文件jbpm.cfg.xml創(chuàng)建一個(gè)單例的ProcessEngine java view plain copy1. ProcessEngineprocessEngine = ProcessEngines.getDefaultProcessEng

40、ine();      方式2:指定其他位置:配置文件,如src根目錄config包下的my-jbpm-cfg.xml。 java view plain copy1. ProcessEngineprocessEngine = ProcessEngineConfiguration  2. .createProcessEngineConfigurationFromResource(  3. "config/my-jbpm-cfg.xml").buil

41、dProcessEngine();  得到各個(gè)Service     RepositoryService     RepositoryService是管理流程定義的倉(cāng)庫(kù)服務(wù)的接口。 java view plain copy1. RepositoryServicerepositoryService = processEngine.getRepositoryService();      RuntimeService&#

42、160;    RuntimeService是activiti的流程執(zhí)行服務(wù)類??梢詮倪@個(gè)服務(wù)類中獲取很多關(guān)于流程執(zhí)行相關(guān)的信息,如執(zhí)行管理,包括啟動(dòng)、推進(jìn)、刪除流程實(shí)例等操作。 java view plain copy1. RuntimeServiceruntimeService = processEngine.getRuntimeService();      TaskService     TaskService是activiti的任務(wù)服務(wù)

43、類??梢詮倪@個(gè)類中獲取任務(wù)的信息。 java view plain copy1. TaskServicetaskservice = processEngine.getTaskService();      HistoryService     HistoryService 是activiti的查詢歷史信息的類。在一個(gè)流程執(zhí)行完成后,這個(gè)對(duì)象為我們提供查詢歷史信息。 java view plain copy1. HistoryServic

44、ehistoryService = processEngine.getHistoryService();      到這里關(guān)于activiti核心對(duì)象ProcessEngine先介紹這么多,下面看我們的小的helloworld的demo。2.5 Demo流程2.5.1 第一步流程設(shè)計(jì)畫出業(yè)務(wù)流程 我們通過流程設(shè)計(jì)器就可以拖拖拽拽出我們的流程,同時(shí)設(shè)置相關(guān)屬性,保存后會(huì)生成兩個(gè)文件,分別是helloworld.bpmn和helloworld.png. 這是我們的流程圖: 2.5.2 第二步部署流程定義

45、60;java view plain copy1. /* 2.  * 部署流程定義 3.  */  4. Test  5. public void deploymentProcessDefinition()   6.     /創(chuàng)建核心引擎對(duì)象  7.     ProcessEngine processEngine =

46、 ProcessEngines.getDefaultProcessEngine();  8.     Deployment deployment = processEngine.getRepositoryService()/ 與流程定義和部署對(duì)象相關(guān)的service  9.             .createDeployment()/ 

47、;創(chuàng)建一個(gè)部署對(duì)象  10.             .name("helloworld入門程序")/ 添加部署的名稱  11.             .addClasspathResource("diagrams/helloworld.bpmn")/ cl

48、asspath的資源中加載,一次只能加載  12.                                             

49、                    / 一個(gè)文件  13.             .addClasspathResource("diagrams/helloworld.png")/ classpath的資源中加載,

50、一次只能加載  14.                                               &#

51、160;             / 一個(gè)文件  15.             .deploy();/ 完成部署  16.     System.out.println("部署ID:" + deploymen

52、t.getId();  17.     System.out.println("部署名稱:" + deployment.getName();  18.   運(yùn)行結(jié)果:    部署ID:1    部署名稱:helloworld入門程序 2.5.3 第三步 啟動(dòng)流程實(shí)例java view plain copy1. /* 2.  * 啟動(dòng)流程實(shí)例

53、0;3.  */  4. Test  5. public void startProcessInstance()   6.     / 流程定義的key  7.     String processDefinitionKey = "HelloWorld"  8.     Proc

54、essInstance pi = processEngine.getRuntimeService()/ 于正在執(zhí)行的流程實(shí)例和執(zhí)行對(duì)象相關(guān)的Service  9.             .startProcessInstanceByKey(processDefinitionKey);/ 使用流程定義的key啟動(dòng)流程實(shí)例,key對(duì)應(yīng)hellworld.bpmn文件中id的屬性值,使用key值啟動(dòng),默認(rèn)是按照

55、最新版本的流程定義啟動(dòng)  10.     System.out.println("流程實(shí)例ID:" + pi.getId();/ 流程實(shí)例ID 101  11.     System.out.println("流程定義ID:" + pi.getProcessDefinitionId(); / 流程定義ID HelloWorld:1:4 &

56、#160;運(yùn)行結(jié)果為:    流程實(shí)例ID:101    流程定義ID:HelloWorld:1:42.5.4 第四步查詢當(dāng)前辦理人的個(gè)人任務(wù)java view plain copy1. /* 2.  * 查詢當(dāng)前人的個(gè)人任務(wù) 3.  */  4. Test  5. public void findMyPersonTask()   6.     String

57、 assignee = "張三"  7.     List<Task> list = processEngine.getTaskService()/ 與正在執(zhí)行的認(rèn)為管理相關(guān)的Service  8.             .createTaskQuery()/ 創(chuàng)建任務(wù)查詢對(duì)象

58、0; 9.             .taskAssignee(assignee)/ 指定個(gè)人認(rèn)為查詢,指定辦理人  10.             .list();  11.   12.     if (list !=

59、 null && list.size() > 0)   13.         for (Task task:list)   14.             System.out.println("任務(wù)ID:"+task.get

60、Id();  15.             System.out.println("任務(wù)名稱:"+task.getName();  16.             System.out.println("任務(wù)的創(chuàng)建時(shí)間"+task);  17.  

61、           System.out.println("任務(wù)的辦理人:"+task.getAssignee();  18.             System.out.println("流程實(shí)例ID:"+task.getProcessInstanceId();  19.  

62、;           System.out.println("執(zhí)行對(duì)象ID:"+task.getExecutionId();  20.             System.out.println("流程定義ID:"+task.getProcessDefinitionId();  21.

63、             System.out.println("#");  22.           23.       24.   運(yùn)行結(jié)果:    任務(wù)ID:104    任務(wù)名稱:提交申請(qǐng)  

64、0; 任務(wù)的創(chuàng)建時(shí)間Taskid=104,name=提交申請(qǐng)    任務(wù)的辦理人:張三    流程實(shí)例ID:101    執(zhí)行對(duì)象ID:101    流程定義ID:HelloWorld:1:4    #  2.5.5 第五步 完成任務(wù)java view plain copy1. /* 2.  * 完成我的任務(wù) 3.  */  4. Test  5. publ

65、ic void completeMyPersonTask()  6.     /任務(wù)Id  7.     String taskId="104"  8.     processEngine.getTaskService()/與正在執(zhí)行的認(rèn)為管理相關(guān)的Service  9.       &#

66、160;     .complete(taskId);  10.     System.out.println("完成任務(wù):任務(wù)ID:"+taskId);  11.   12.   運(yùn)行結(jié)果:    完成任務(wù):任務(wù)ID:104    到這里我們就完成了一個(gè)簡(jiǎn)單的helloworld,從畫一個(gè)流程圖、到部署流程定義、啟動(dòng)流程實(shí)例、查詢當(dāng)前辦理人的任務(wù)、完成當(dāng)前的任務(wù),從

67、第二步開始每一步在數(shù)據(jù)庫(kù)中都會(huì)有相應(yīng)的記錄進(jìn)行添加、刪除、更新,我們運(yùn)行產(chǎn)生的結(jié)果也都是從數(shù)據(jù)庫(kù)中查出來(lái)的記錄,關(guān)于每一步對(duì)應(yīng)與數(shù)據(jù)庫(kù)中怎樣的變化,我們會(huì)在后續(xù)的文章繼續(xù)介紹。2.6 后記    我們本篇文章主要講述了activiti的環(huán)境準(zhǔn)備包含各個(gè)軟件的版本和安裝流程設(shè)計(jì)器,接下來(lái)我們講解了兩種方式來(lái)創(chuàng)建activiti的23張表,還夾雜著一個(gè)數(shù)據(jù)庫(kù)連接url的寫法,接下來(lái)是activiti核心對(duì)象ProcessEngine,以及通過ProcessEngine獲取相關(guān)的Service,最后通過一個(gè)特別簡(jiǎn)單的小demo來(lái)讓大家對(duì)部署流程定義、啟動(dòng)流程實(shí)例、查詢當(dāng)前任務(wù)、完

68、成當(dāng)前任務(wù)這些步驟有一個(gè)感性的認(rèn)識(shí),詳細(xì)的內(nèi)容我們會(huì)在后續(xù)文章繼續(xù)介紹。3 Activiti流程定義管理3.1 前言    在上一篇文章我們通過一個(gè)小demo對(duì)Activiti進(jìn)行了宏觀的介紹,讓大家對(duì)Activiti有了整體的認(rèn)識(shí),這篇文章我們來(lái)學(xué)習(xí)具體的流程定義管理的CRUD.3.2 正文3.2.1 流程定義是什么    ProcessDefinition(流程定義)就是一個(gè)流程的步驟說(shuō)明,比如我們接下來(lái)要說(shuō)的這個(gè)流程,申請(qǐng)人王三發(fā)起提交申請(qǐng),李四作為部門經(jīng)理進(jìn)行審批,審批完成后,此申請(qǐng)到達(dá)下一級(jí)總經(jīng)理王五,進(jìn)行審批。就這么整個(gè)流程說(shuō)明其實(shí)就是流程定

69、義,不過在Activiti中整個(gè)流程定義是以helloworld.bpmn與helloworld.png格式存在的。    在上一篇文章中我們只是稍微提了下,關(guān)于helloworld.bpmn是在流程設(shè)計(jì)器中拖拖拽拽形成的,其實(shí)還可以通過在配置文件中進(jìn)行配置,具體的圖形我已經(jīng)放到了上一篇文章中了,現(xiàn)在我就將我配置好的helloworld.bpmn配置文件展示給大家:html view plain copy1. <?xml version="1.0" encoding="UTF-8"?>

70、;  2. <definitions xmlns="/spec/BPMN/20100524/MODEL" xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema" xmlns:activiti="/bpmn" xmlns:bpmndi=&

71、quot;/spec/BPMN/20100524/DI" xmlns:omgdc="/spec/DD/20100524/DC" xmlns:omgdi="/spec/DD/20100524/DI" typeLanguage="/2001/XMLSchema" expressionLanguage="/1999/X

72、Path" targetNamespace="/test">  3.   <process id="HelloWorld" name="HelloWorldProcess" isExecutable="true">  4.     <startEvent id="starteven

73、t1" name="Start"></startEvent>  5.     <endEvent id="endevent1" name="End"></endEvent>  6.     <userTask id="usertask1" name="提交申請(qǐng)" 

74、;activiti:assignee="張三"></userTask>  7.     <userTask id="usertask2" name="審批【部門經(jīng)理】" activiti:assignee="李四"></userTask>  8.     <userTask id="usertask3

75、" name="審批【總經(jīng)理】" activiti:assignee="王五"></userTask>  9.     <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>  10.  &

76、#160;  <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>  11.     <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="u

77、sertask3"></sequenceFlow>  12.     <sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>  13.   </process>  14.   <bpmn

78、di:BPMNDiagram id="BPMNDiagram_HelloWorld">  15.     <bpmndi:BPMNPlane bpmnElement="HelloWorld" id="BPMNPlane_HelloWorld">  16.       <bpmndi:BPMNShape bpmnElement=&quo

79、t;startevent1" id="BPMNShape_startevent1">  17.         <omgdc:Bounds height="35.0" width="35.0" x="320.0" y="50.0"></omgdc:Bounds>  18.  &#

80、160;    </bpmndi:BPMNShape>  19.       <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">  20.         <omgdc:Bounds height

81、="35.0" width="35.0" x="320.0" y="430.0"></omgdc:Bounds>  21.       </bpmndi:BPMNShape>  22.       <bpmndi:BPMNShape bpmnElement="usertas

82、k1" id="BPMNShape_usertask1">  23.         <omgdc:Bounds height="55.0" width="105.0" x="285.0" y="120.0"></omgdc:Bounds>  24.    &

83、#160;  </bpmndi:BPMNShape>  25.       <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">  26.         <omgdc:Bounds height="55.0

84、" width="105.0" x="285.0" y="240.0"></omgdc:Bounds>  27.       </bpmndi:BPMNShape>  28.       <bpmndi:BPMNShape bpmnElement="usertask3"&#

85、160;id="BPMNShape_usertask3">  29.         <omgdc:Bounds height="55.0" width="105.0" x="285.0" y="350.0"></omgdc:Bounds>  30.      

86、; </bpmndi:BPMNShape>  31.       <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">  32.         <omgdi:waypoint x="337.0" y="85

87、.0"></omgdi:waypoint>  33.         <omgdi:waypoint x="337.0" y="120.0"></omgdi:waypoint>  34.       </bpmndi:BPMNEdge>  35.   &#

88、160;   <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">  36.         <omgdi:waypoint x="337.0" y="175.0"></omgdi:waypoint>  37.  

89、0;      <omgdi:waypoint x="337.0" y="240.0"></omgdi:waypoint>  38.       </bpmndi:BPMNEdge>  39.       <bpmndi:BPMNEdge bpmnElement=&q

90、uot;flow3" id="BPMNEdge_flow3">  40.         <omgdi:waypoint x="337.0" y="295.0"></omgdi:waypoint>  41.         <omgdi:waypoint 

91、;x="337.0" y="350.0"></omgdi:waypoint>  42.       </bpmndi:BPMNEdge>  43.       <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"> &

92、#160;44.         <omgdi:waypoint x="337.0" y="405.0"></omgdi:waypoint>  45.         <omgdi:waypoint x="337.0" y="430.0"></omgdi:w

93、aypoint>  46.       </bpmndi:BPMNEdge>  47.     </bpmndi:BPMNPlane>  48.   </bpmndi:BPMNDiagram>  49. </definitions>      通過流程設(shè)計(jì)器或者通過配置文件直接書寫都是可以的。3.2.2

94、流程定義的CRUD  部署流程定義     在進(jìn)行流程定義的操作之前,先要將流程定義進(jìn)行部署,部署流程定義的方式有兩種:     1.部署流程定義的helloworld.bpmn與helloworld.png兩個(gè)文件java view plain copy1. /* 2.  * 部署流程定義 類路徑從classpath 3.  */  4. Test  5. public 

95、void deoploymentProcessDefinition_classpath()   6.     Deployment deployment = processEngine.getRepositoryService() / 與流程定義和部署對(duì)象相關(guān)的service  7.             .createDeploym

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論