在上一篇文章中我們將工作流的相關概念、activiti的前世今生、activiti與jbpm的比較進行學習,這篇文章我們正式進行activiti的學習,activiti的整個學習我們主要通過例子的形式來理解。今天我們主要是準備下activiti的環境,在數據庫中創建activiti默認的23張表以及activiti核心對象PRocessEngine最后是一個activiti的簡單demo。
相關軟件及版本:
jdk版本:Jdk1.8
IDE:eclipse
數據庫:MySQL
Activiti:5.13
eclipse中安裝流程設計器插件:
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相關包)+mysql對應驅動包(mysql-connector-java.jar)
jar包引入完畢后,我們環境就準備的差不多了,往下我們就該創建我們activiti數據庫默認的表了。
在activiti中,相對于前身jbpm基礎上又額外多了5張表,所有現在的activiti框架默認提供了23張表。所以第一步我們就來創建這23張表。
[java] view plain copy方法1:使用代碼來創建activiti工作流的表 // 使用代碼創建工作流需要的23張表 @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"); /* * public static final String DB_SCHEMA_UPDATE_FALSE = "false"; * 不能自動創建表,需要表存在 public static final String DB_SCHEMA_UPDATE_CREATE_DROP * = "create-drop"; 先刪除表再創建表 public static final String * DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,自動創建表 */ //如果表不存在,自動創建表 processEngineConfiguration .setDatabaseSchemaUpdate(processEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); // 工作流的核心對象,ProcessEnginee對象 ProcessEngine processEngine = processEngineConfiguration .buildProcessEngine(); System.out.println(processEngine); } 代碼執行完畢,我們通過navicat查看數據庫會發現,創建了一個新的數據庫activiti1,并且還有23張表。
在類路徑下創建Activiti.cfg.xml文件,文件內容為:
[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://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <!-- 連接數據的配置 --> <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> <!-- 沒有表創建表 --> <property name="databaseSchemaUpdate" value="true"></property> </bean> </beans>通過代碼來加載配置文件中內容:
[java] view plain copy/** * 使用配置文件來創建數據庫中的表 */ @Test public void createTable_2() { //通過讓工作流引擎的全部配置對象來執行配置文件中的內容來創建流程引擎對象 ProcessEngine processEngine = ProcessEngineConfiguration .createProcessEngineConfigurationFromResource( "activiti.cfg.xml").buildProcessEngine(); System.out.println("processEngine" + processEngine); } 運行產生的結果與第一種是一樣的,其中這一種通過配置文件的方式是用的是比第一種多的。
無論是通過代碼還是通過xml文件來創建工作流的表,里面都涉及到一個知識點就是mysql的url的寫法,我們進行下小結:
#autoReconnect當數據庫連接丟失時是否自動連接,取值true/false 缺省為false
#maxReconnects如果autoReconnect為true,此參數為重試次數,缺省為3次
#initialTimeout如果autoReconnect為true,此參數為重新連接前等待的秒數缺省為2
#maxRows設置查詢時返回的行數,0表示全部缺省為0
#useUnicode是否使用unicode輸出,true/false缺省為false
#characterEncoding如果useUnicode,該參數制定encoding類型,建議使用utf8缺省為無
#createDatabaseIfNotExist當JDBC連接指定數據庫,如果此數據庫不存在,此參數值為true時,則自動創建此數據庫
下面是一個url的例子:
[java] view plain copyjdbc:mysql://localhost:3306/ourmysql? createDatabaseIfNotExist=true& amp;useUnicode=true& amp;characterEncoding=utf8& amp;autoReconnect=true& amp;useLocalsessionState=true
數據庫里的表創建完畢,接下來我們講述activiti里面的核心對象ProcessEngine。
ProcessEngine類,一般稱為流程引擎類,沒錯,這個流程引擎就是我們上一篇文章中提到的流程引擎,它是activiti中最核心的類,并且這個類是線程安全的,所有的線程和請求都可以使用同一個ProcessEngine對象,其它常用類幾乎也都是由它而來的。
方式1:使用classpath根目錄下的默認配置文件jbpm.cfg.xml創建一個單例的ProcessEngine
[java] view plain copyProcessEngineprocessEngine = ProcessEngines.getDefaultProcessEngine(); 方式2:指定其他位置:配置文件,如src根目錄config包下的my-jbpm-cfg.xml。
[java] view plain copyProcessEngineprocessEngine = ProcessEngineConfiguration .createProcessEngineConfigurationFromResource( "config/my-jbpm-cfg.xml").buildProcessEngine();
得到各個Service
RepositoryService
RepositoryService是管理流程定義的倉庫服務的接口。
[java] view plain copyRepositoryServicerepositoryService = processEngine.getRepositoryService(); RuntimeService
RuntimeService是activiti的流程執行服務類??梢詮倪@個服務類中獲取很多關于流程執行相關的信息,如執行管理,包括啟動、推進、刪除流程實例等操作。
[java] view plain copyRuntimeServiceruntimeService = processEngine.getRuntimeService(); TaskService
TaskService是activiti的任務服務類??梢詮倪@個類中獲取任務的信息。
[java] view plain copyTaskServicetaskservice = processEngine.getTaskService(); HistoryService
HistoryService 是activiti的查詢歷史信息的類。在一個流程執行完成后,這個對象為我們提供查詢歷史信息。
[java] view plain copyHistoryServicehistoryService = processEngine.getHistoryService(); 到這里關于activiti核心對象ProcessEngine先介紹這么多,下面看我們的小的helloworld的demo。
我們通過流程設計器就可以拖拖拽拽出我們的流程,同時設置相關屬性,保存后會生成兩個文件,分別是helloworld.bpmn和helloworld.png.
這是我們的流程圖:
[java] view plain copy/** * 部署流程定義 */ @Test public void deploymentProcessDefinition() { //創建核心引擎對象 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); Deployment deployment = processEngine.getRepositoryService()// 與流程定義和部署對象相關的service .createDeployment()// 創建一個部署對象 .name("helloworld入門程序")// 添加部署的名稱 .addClasspathResource("diagrams/helloworld.bpmn")// classpath的資源中加載,一次只能加載 // 一個文件 .addClasspathResource("diagrams/helloworld.png")// classpath的資源中加載,一次只能加載 // 一個文件 .deploy();// 完成部署 System.out.println("部署ID:" + deployment.getId()); System.out.println("部署名稱:" + deployment.getName()); } 運行結果:
部署ID:1
部署名稱:helloworld入門程序
[java] view plain copy/** * 啟動流程實例 */ @Test public void startProcessInstance() { // 流程定義的key String processDefinitionKey = "HelloWorld"; ProcessInstance pi = processEngine.getRuntimeService()// 于正在執行的流程實例和執行對象相關的Service .startProcessInstanceByKey(processDefinitionKey);// 使用流程定義的key啟動流程實例,key對應hellworld.bpmn文件中id的屬性值,使用key值啟動,默認是按照最新版本的流程定義啟動 System.out.println("流程實例ID:" + pi.getId());// 流程實例ID 101 System.out.println("流程定義ID:" + pi.getProcessDefinitionId()); // 流程定義ID HelloWorld:1:4 運行結果為:
流程實例ID:101
流程定義ID:HelloWorld:1:4
任務ID:104
任務名稱:提交申請
任務的創建時間Task[id=104,name=提交申請]
任務的辦理人:張三
流程實例ID:101
執行對象ID:101
流程定義ID:HelloWorld:1:4
#################################
完成任務:任務ID:104
到這里我們就完成了一個簡單的helloworld,從畫一個流程圖、到部署流程定義、啟動流程實例、查詢當前辦理人的任務、完成當前的任務,從第二步開始每一步在數據庫中都會有相應的記錄進行添加、刪除、更新,我們運行產生的結果也都是從數據庫中查出來的記錄,關于每一步對應與數據庫中怎樣的變化,我們會在后續的文章繼續介紹。
我們本篇文章主要講述了activiti的環境準備包含各個軟件的版本和安裝流程設計器,接下來我們講解了兩種方式來創建activiti的23張表,還夾雜著一個數據庫連接url的寫法,接下來是activiti核心對象ProcessEngine,以及通過ProcessEngine獲取相關的Service,最后通過一個特別簡單的小demo來讓大家對部署流程定義、啟動流程實例、查詢當前任務、完成當前任務這些步驟有一個感性的認識,詳細的內容我們會在后續文章繼續介紹。
http://blog.csdn.net/zwk626542417/article/details/46594505
新聞熱點
疑難解答