一、前言
?
? ? 在上一篇文章中我們將工作流的相關(guān)概念、activiti的前世今生、activiti與jbpm的比較進行學習,這篇文章我們正式進行activiti的學習,activiti的整個學習我們主要通過例子的形式來理解。今天我們主要是準備下activiti的環(huán)境,在數(shù)據(jù)庫中創(chuàng)建activiti默認的23張表以及activiti核心對象ProcessEngine最后是一個activiti的簡單demo。
?
?
二、環(huán)境準備
?
? ? 相關(guān)軟件及版本:
?
? ? jdk版本:Jdk1.8
? ? IDE:eclipse
? ? 數(shù)據(jù)庫:MySQL
? ? Activiti:5.13
?
? ? eclipse中安裝流程設(shè)計器插件:
?
? ? eclipse打開help->install new software,單擊add:?
? ? Name: Activiti BPMN2.0 designer?
? ? Location:http://activiti.org/designer/update/?
進行安裝即可。
?
? ? 引入jar包:
?
? ? ${Activiti_HOME}/install/activiti-5.13/libs(activiti相關(guān)包)+mysql對應(yīng)驅(qū)動包(mysql-connector-Java.jar)
?
? ? jar包引入完畢后,我們環(huán)境就準備的差不多了,往下我們就該創(chuàng)建我們activiti數(shù)據(jù)庫默認的表了。
?
三、創(chuàng)建activiti表
?
? ? 在activiti中,相對于前身jbpm基礎(chǔ)上又額外多了5張表,所有現(xiàn)在的activiti框架默認提供了23張表。所以第一步我們就來創(chuàng)建這23張表。
?
方法1:使用代碼來創(chuàng)建activiti工作流的表
?
?
[java]?view plain?copy
方法1:使用代碼來創(chuàng)建activiti工作流的表????@Test??public?void?createTable()?{??????????ProcessEngineConfiguration?processEngineConfiguration?=?ProcessEngineConfiguration??????????????.createStandaloneProcessEngineConfiguration();????????????processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");??????processEngineConfiguration??????????????.setJdbcUrl("jdbc:mysql://localhost:3306/activiti1?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8");??????processEngineConfiguration.setJdbcUsername("root");??????processEngineConfiguration.setJdbcPassword("123456");?????????????????processEngineConfiguration??????????????.setDatabaseSchemaUpdate(processEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);??????????ProcessEngine?processEngine?=?processEngineConfiguration??????????????.buildProcessEngine();??????System.out.println(processEngine);??????}??
? ? 代碼執(zhí)行完畢,我們通過navicat查看數(shù)據(jù)庫會發(fā)現(xiàn),創(chuàng)建了一個新的數(shù)據(jù)庫activiti1,并且還有23張表。
?
?
?
方式2:使用配置文件來創(chuàng)建activiti的表
?
? ? 在類路徑下創(chuàng)建Activiti.cfg.xml文件,文件內(nèi)容為:
?
?
[java]?view plain?copy
<beans?xmlns="http://www.springframework.org/schema/beans"??????xmlns:context="http://www.springframework.org/schema/context"?xmlns:tx="http://www.springframework.org/schema/tx"??????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??????xsi:schemaLocation="http:http:http:????????<bean?id="processEngineConfiguration"??????????class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">??????????<!--?連接數(shù)據(jù)的配置?-->??????????<property?name="jdbcDriver"?value="com.mysql.jdbc.Driver"></property>??????????<property?name="jdbcUrl"??????????????value="jdbc:mysql://localhost:3306/activiti1?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8"></property>??????????<property?name="jdbcUsername"?value="root"></property>??????????<property?name="jdbcPassword"?value="123456"></property>??????????<!--?沒有表創(chuàng)建表?-->??????????<property?name="databaseSchemaUpdate"?value="true"></property>??????</bean>????</beans>??
?
? ? 通過代碼來加載配置文件中內(nèi)容:
?
?
[java]?view plain?copy
@Test??public?void?createTable_2()?{??????????ProcessEngine?processEngine?=?ProcessEngineConfiguration??????????????.createProcessEngineConfigurationFromResource(??????????????????????"activiti.cfg.xml").buildProcessEngine();??????System.out.println("processEngine"?+?processEngine);??}??
運行產(chǎn)生的結(jié)果與第一種是一樣的,其中這一種通過配置文件的方式是用的是比第一種多的。
?
?
?
連接數(shù)據(jù)庫url寫法:
?
? ? 無論是通過代碼還是通過xml文件來創(chuàng)建工作流的表,里面都涉及到一個知識點就是mysql的url的寫法,我們進行下小結(jié):
?
? ? #autoReconnect當數(shù)據(jù)庫連接丟失時是否自動連接,取值true/false 缺省為false
?
? ? #maxReconnects如果autoReconnect為true,此參數(shù)為重試次數(shù),缺省為3次?
?
? ? #initialTimeout如果autoReconnect為true,此參數(shù)為重新連接前等待的秒數(shù)缺省為2
?
? ? #maxRows設(shè)置查詢時返回的行數(shù),0表示全部缺省為0
?
? ? #useUnicode是否使用unicode輸出,true/false缺省為false
?
? ? #characterEncoding如果useUnicode,該參數(shù)制定encoding類型,建議使用utf8缺省為無
?
? ? #createDatabaseIfNotExist當JDBC連接指定數(shù)據(jù)庫,如果此數(shù)據(jù)庫不存在,此參數(shù)值為true時,則自動創(chuàng)建此數(shù)據(jù)庫
?
? ? 下面是一個url的例子:
?
[java]?view plain?copy
jdbc:mysql:createDatabaseIfNotExist=true&??amp;useUnicode=true&??amp;characterEncoding=utf8&??amp;autoReconnect=true&??amp;useLocalSessionState=true??
?
四、核心對象ProcessEngine
?
? ? 數(shù)據(jù)庫里的表創(chuàng)建完畢,接下來我們講述activiti里面的核心對象ProcessEngine。
?
? ? ProcessEngine類,一般稱為流程引擎類,沒錯,這個流程引擎就是我們上一篇文章中提到的流程引擎,它是activiti中最核心的類,并且這個類是線程安全的,所有的線程和請求都可以使用同一個ProcessEngine對象,其它常用類幾乎也都是由它而來的。
?
得到ProcessEngine對象:
?
? ? 方式1:使用classpath根目錄下的默認配置文件jbpm.cfg.xml創(chuàng)建一個單例的ProcessEngine
?
?
[java]?view plain?copy
ProcessEngineprocessEngine?=?ProcessEngines.getDefaultProcessEngine();??
? ? 方式2:指定其他位置:配置文件,如src根目錄config包下的my-jbpm-cfg.xml。
?
?
?
[java]?view plain?copy
ProcessEngineprocessEngine?=?ProcessEngineConfiguration??.createProcessEngineConfigurationFromResource(??"config/my-jbpm-cfg.xml").buildProcessEngine();??
?
得到各個Service
?
? ? RepositoryService
?
? ? RepositoryService是管理流程定義的倉庫服務(wù)的接口。
?
?
[java]?view plain?copy
RepositoryServicerepositoryService?=?processEngine.getRepositoryService();??
? ??RuntimeService
?
?
? ? RuntimeService是activiti的流程執(zhí)行服務(wù)類。可以從這個服務(wù)類中獲取很多關(guān)于流程執(zhí)行相關(guān)的信息,如執(zhí)行管理,包括啟動、推進、刪除流程實例等操作。
?
?
[java]?view plain?copy
RuntimeServiceruntimeService?=?processEngine.getRuntimeService();??
? ??TaskService
?
?
? ? TaskService是activiti的任務(wù)服務(wù)類。可以從這個類中獲取任務(wù)的信息。
?
?
?
[java]?view plain?copy
TaskServicetaskservice?=?processEngine.getTaskService();??
? ??HistoryService
?
?
? ? HistoryService 是activiti的查詢歷史信息的類。在一個流程執(zhí)行完成后,這個對象為我們提供查詢歷史信息。
?
?
[java]?view plain?copy
HistoryServicehistoryService?=?processEngine.getHistoryService();??
? ? 到這里關(guān)于activiti核心對象ProcessEngine先介紹這么多,下面看我們的小的helloworld的demo。
?
?
五、Demo流程
?
第一步流程設(shè)計畫出業(yè)務(wù)流程
?
我們通過流程設(shè)計器就可以拖拖拽拽出我們的流程,同時設(shè)置相關(guān)屬性,保存后會生成兩個文件,分別是helloworld.bpmn和helloworld.png.
?
這是我們的流程圖:
?
?
第二步部署流程定義
?
?
[java]?view plain?copy
@Test??public?void?deploymentProcessDefinition()?{??????????ProcessEngine?processEngine?=?ProcessEngines.getDefaultProcessEngine();??????Deployment?deployment?=?processEngine.getRepositoryService()????????????.createDeployment()????????????.name("helloworld入門程序")????????????.addClasspathResource("diagrams/helloworld.bpmn")????????????????????????????????????????????????????????????????????????????.addClasspathResource("diagrams/helloworld.png")????????????????????????????????????????????????????????????????????????.deploy();????System.out.println("部署ID:"?+?deployment.getId());??????System.out.println("部署名稱:"?+?deployment.getName());??}??
運行結(jié)果:
?
?
? ? 部署ID:1
? ? 部署名稱:helloworld入門程序
?
?
第三步?啟動流程實例
?
?
[java]?view plain?copy
@Test??public?void?startProcessInstance()?{??????????String?processDefinitionKey?=?"HelloWorld";??????ProcessInstance?pi?=?processEngine.getRuntimeService()????????????.startProcessInstanceByKey(processDefinitionKey);????System.out.println("流程實例ID:"?+?pi.getId());????System.out.println("流程定義ID:"?+?pi.getProcessDefinitionId());?
運行結(jié)果為:
?
?
? ? 流程實例ID:101
? ? 流程定義ID:HelloWorld:1:4
?
第四步查詢當前辦理人的個人任務(wù)
?
?
[java]?view plain?copy
@Test??public?void?findMyPersonTask()?{??????String?assignee?=?"張三";??????List<Task>?list?=?processEngine.getTaskService()????????????.createTaskQuery()????????????.taskAssignee(assignee)????????????.list();????????if?(list?!=?null?&&?list.size()?>?0)?{??????????for?(Task?task:list)?{??????????????System.out.println("任務(wù)ID:"+task.getId());??????????????System.out.println("任務(wù)名稱:"+task.getName());??????????????System.out.println("任務(wù)的創(chuàng)建時間"+task);??????????????System.out.println("任務(wù)的辦理人:"+task.getAssignee());??????????????System.out.println("流程實例ID:"+task.getProcessInstanceId());??????????????System.out.println("執(zhí)行對象ID:"+task.getExecutionId());??????????????System.out.println("流程定義ID:"+task.getProcessDefinitionId());??????????????System.out.println("#################################");??????????}??????}??}??
運行結(jié)果:
?
?
? ? 任務(wù)ID:104
? ? 任務(wù)名稱:提交申請
? ? 任務(wù)的創(chuàng)建時間Task[id=104,name=提交申請]
? ? 任務(wù)的辦理人:張三
? ? 流程實例ID:101
? ? 執(zhí)行對象ID:101
? ? 流程定義ID:HelloWorld:1:4
? ? #################################
?
?
第五步?完成任務(wù)
?
?
[java]?view plain?copy
@Test??public?void?completeMyPersonTask(){??????????String?taskId="104";??????processEngine.getTaskService()????????????.complete(taskId);??????System.out.println("完成任務(wù):任務(wù)ID:"+taskId);????}??
運行結(jié)果:
?
?
? ? 完成任務(wù):任務(wù)ID:104
?
?
? ? 到這里我們就完成了一個簡單的helloworld,從畫一個流程圖、到部署流程定義、啟動流程實例、查詢當前辦理人的任務(wù)、完成當前的任務(wù),從第二步開始每一步在數(shù)據(jù)庫中都會有相應(yīng)的記錄進行添加、刪除、更新,我們運行產(chǎn)生的結(jié)果也都是從數(shù)據(jù)庫中查出來的記錄,關(guān)于每一步對應(yīng)與數(shù)據(jù)庫中怎樣的變化,我們會在后續(xù)的文章繼續(xù)介紹。
?
?
六、后記
?
? ? 我們本篇文章主要講述了activiti的環(huán)境準備包含各個軟件的版本和安裝流程設(shè)計器,接下來我們講解了兩種方式來創(chuàng)建activiti的23張表,還夾雜著一個數(shù)據(jù)庫連接url的寫法,接下來是activiti核心對象ProcessEngine,以及通過ProcessEngine獲取相關(guān)的Service,最后通過一個特別簡單的小demo來讓大家對部署流程定義、啟動流程實例、查詢當前任務(wù)、完成當前任務(wù)這些步驟有一個感性的認識,詳細的內(nèi)容我們會在后續(xù)文章繼續(xù)介紹。
http://blog.csdn.net/zwk626542417/article/details/46594505
轉(zhuǎn)載于:https://www.cnblogs.com/zzuzhenlei/p/7569440.html
總結(jié)
以上是生活随笔為你收集整理的工作流学习——Activiti整体认识二步曲的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。