




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
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ī)則流程來傳遞與執(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ù)語、體系結(jié)構(gòu)及應(yīng)用編程接口等方面制定了一系列標(biāo)準(zhǔn),是唯一的致力于工作流標(biāo)準(zhǔn)的專業(yè)組織。 WfMS 接下來要說的是工作流管理系統(tǒng)(WorkflowManagement System,WfMS)
3、,它完成了工作量的定義和管理,并按照在系統(tǒng)中預(yù)先定義好的工作流規(guī)則進(jìn)行工作流實(shí)例的執(zhí)行的軟件系統(tǒng),這里要說明一下的是,并不是我們企業(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被用來定義、管理和執(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é)再反過來理解工作流引擎,工作流引擎一般都做兩件事情: 1.定義流程,也就是給我們提供某種規(guī)范來定義規(guī)則,以及如何定義一個(gè)流程的這種規(guī)范,同事我們可以根據(jù)工作流引擎提供的相關(guān)概念來定義更為復(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)官方的話來總結(jié)一下工作流引擎,工作流引擎為我們提供相關(guān)規(guī)則概念的定義,給我們提供了相關(guān)的API來調(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)概念就介紹完了,接下來我們先了解一下我們的主角activiti的前世今生。 1.1.3 Activiti前世今生 Activiti 的創(chuàng)始人是 Tom Baeyens 說到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é)合的越來越緊密,對(duì)jBPM在更廣泛的范圍使用形成了阻礙。JBoss內(nèi)部對(duì)jBPM未來版本的架構(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 !所以說Activiti5是在jBPM 3、jBPM 4的基礎(chǔ)上發(fā)展而來的,是原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ù)庫持久層ORMMyBatis3Hibernate32持久化標(biāo)準(zhǔn)無JPA規(guī)范3事務(wù)管理MyBatis機(jī)制/spring事務(wù)控制Bitronix,基于JTA事務(wù)管理4數(shù)據(jù)庫連接方式Jdbc/DataSourceJdbc/DataSource5支持?jǐn)?shù)據(jù)庫Oracle、SQL Server、MySQL等多數(shù)數(shù)據(jù)庫Oracle、SQL
10、Server、MySQL等多數(shù)數(shù)據(jù)庫6設(shè)計(jì)模式Command模式、觀察者模式等無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)勢是采用了PVM(流程虛擬機(jī)),支持除了BPMN2.0規(guī)范之外的流程格式,
11、與外部服務(wù)有良好的集成能力,延續(xù)了jBPM3、jBPM4良好的社區(qū)支持,服務(wù)接口清晰,鏈?zhǔn)紸PI更為優(yōu)雅;劣勢是持久化層沒有遵循JPA規(guī)范。 jBPM最大的優(yōu)勢是采用了ApacheMina異步通信技術(shù),采用JPA/JTA持久化方面的標(biāo)準(zhǔn),以功能齊全的Guvnor作為流程倉庫,有RedHat(jB被紅帽收購)的專業(yè)化支持;但其劣勢也很明顯,對(duì)自身技術(shù)依賴過緊且目前僅支持BPMN2。 我們對(duì)Activiti和jBPM進(jìn)行比較目的是為了讓我們可以對(duì)他們的特性更加的了解,只有了解了他們的特性以后,這樣當(dāng)我們遇到具
12、體的項(xiàng)目時(shí)就可以根據(jù)需要來選用適合的工作流框架。 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í)我們主要通過例子的形式來理解。今天我們主要是準(zhǔn)備下activiti的環(huán)境,在數(shù)據(jù)庫中創(chuàng)建activiti默
13、認(rèn)的23張表以及activiti核心對(duì)象ProcessEngine最后是一個(gè)activiti的簡單demo。2.2 環(huán)境準(zhǔn)備 相關(guān)軟件及版本: jdk版本:Jdk1.8 IDE:eclipse 數(shù)據(jù)庫: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ù)庫默認(rèn)的表了。2.3 創(chuàng)建activiti表 在activiti中,相對(duì)于前身jbpm基礎(chǔ)上又額外多了5張表,所有現(xiàn)在的activiti框架默認(rèn)提供了23張表。所以第一步我們就來創(chuàng)建這23張表。 方法1:使用代碼來創(chuàng)建activiti工作流的表 java view plain copy1. 方法1:使用代碼來創(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ù)庫會(huì)發(fā)現(xiàn),創(chuàng)建了一個(gè)新的數(shù)據(jù)庫activiti1,并且還有23張表。 方式2:使用配置文件來創(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> 通過代碼來加載配置文件中內(nèi)容:java view plain copy1. /* 2. * 使用配置文件來創(chuàng)建數(shù)據(jù)庫中的表 3. */
33、; 4. Test 5. public void createTable_2() 6. /通過讓工作流引擎的全部配置對(duì)象來執(zhí)行配置文件中的內(nè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ù)庫url寫法: 無論是通過代碼還是通過xml文件來創(chuàng)建工作流的表,里面都涉及到一個(gè)知識(shí)點(diǎn)就是mysql的url的寫法,我們進(jìn)行下小結(jié): #autoReconnect當(dāng)數(shù)據(jù)庫連接丟失時(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缺省為無 #createDatabaseIfNotExist當(dāng)JDBC連接指定數(shù)據(jù)庫,如果此數(shù)據(jù)庫不存在,此參數(shù)值為true時(shí),則自動(dòng)創(chuàng)建此數(shù)據(jù)庫 下面是一個(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ù)庫里的表創(chuàng)建完畢,接下來我們講述activiti里面的核心對(duì)象ProcessEngine。 ProcessEngine類,一般稱為流程引擎類,沒錯(cuò),這個(gè)流程引擎就是我們上一篇文章中
39、提到的流程引擎,它是activiti中最核心的類,并且這個(gè)類是線程安全的,所有的線程和請(qǐng)求都可以使用同一個(gè)ProcessEngine對(duì)象,其它常用類幾乎也都是由它而來的。 得到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是管理流程定義的倉庫服務(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è)簡單的helloworld,從畫一個(gè)流程圖、到部署流程定義、啟動(dòng)流程實(shí)例、查詢當(dāng)前辦理人的任務(wù)、完成當(dāng)前的任務(wù),從
67、第二步開始每一步在數(shù)據(jù)庫中都會(huì)有相應(yīng)的記錄進(jìn)行添加、刪除、更新,我們運(yùn)行產(chǎn)生的結(jié)果也都是從數(shù)據(jù)庫中查出來的記錄,關(guān)于每一步對(duì)應(yīng)與數(shù)據(jù)庫中怎樣的變化,我們會(huì)在后續(xù)的文章繼續(xù)介紹。2.6 后記 我們本篇文章主要講述了activiti的環(huán)境準(zhǔn)備包含各個(gè)軟件的版本和安裝流程設(shè)計(jì)器,接下來我們講解了兩種方式來創(chuàng)建activiti的23張表,還夾雜著一個(gè)數(shù)據(jù)庫連接url的寫法,接下來是activiti核心對(duì)象ProcessEngine,以及通過ProcessEngine獲取相關(guān)的Service,最后通過一個(gè)特別簡單的小demo來讓大家對(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í),這篇文章我們來學(xué)習(xí)具體的流程定義管理的CRUD.3.2 正文3.2.1 流程定義是什么 ProcessDefinition(流程定義)就是一個(gè)流程的步驟說明,比如我們接下來要說的這個(gè)流程,申請(qǐng)人王三發(fā)起提交申請(qǐng),李四作為部門經(jīng)理進(jìn)行審批,審批完成后,此申請(qǐng)到達(dá)下一級(jí)總經(jīng)理王五,進(jìn)行審批。就這么整個(gè)流程說明其實(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Unit 7 Section A Grammar focus - 4c 英文版教學(xué)設(shè)計(jì) 2024-2025學(xué)年人教版八年級(jí)英語下冊(cè)
- 初中語文-第六單元《石壕吏》杜甫教學(xué)設(shè)計(jì)-2023-2024學(xué)年統(tǒng)編版語文八年級(jí)下冊(cè)計(jì)
- 低溫液氧儲(chǔ)罐合同范例
- 兼職送貨司機(jī)勞動(dòng)合同范例
- 買新房定金合同范例
- 街道總工會(huì)工作總結(jié)與計(jì)劃
- 試用期個(gè)人思想工作總結(jié)
- 臨時(shí)用電咨詢合同范例
- 臨時(shí)工合同范例
- 兼職工人合同范例
- 設(shè)計(jì)和開發(fā)控制程序
- 07K506 多聯(lián)式空調(diào)機(jī)系統(tǒng)設(shè)計(jì)與施工安裝
- 透水磚鋪裝施工方案
- 危急值報(bào)告制度
- 道路橋梁工程技術(shù)專業(yè)學(xué)生職業(yè)規(guī)劃書
- 《十步訊問法》讀書筆記
- GB/T 42599-2023風(fēng)能發(fā)電系統(tǒng)電氣仿真模型驗(yàn)證
- 術(shù)前肺功能評(píng)估的意義
- 分布式文件系統(tǒng)
- 手槍的基礎(chǔ)射擊演示文稿
- 浮針療法的學(xué)習(xí)課件
評(píng)論
0/150
提交評(píng)論