Activiti是一個開源的工做流引擎,它實現了BPMN 2.0規範,能夠發佈設計好的流程定義,並經過api進行流程調度。java
Activiti 做爲一個聽從 Apache 許可的工做流和業務流程管理開源平臺,其核心是基於 Java 的超快速、超穩定的 BPMN2.0 流程引擎,強調流程服務的可嵌入性和可擴展性,同時更增強調面向業務人員。mysql
Activiti 流程引擎重點關注在系統開發的易用性和輕量性上。每一項 BPM 業務功能 Activiti 流程引擎都以服務的形式提供給開發人員。經過使用這些服務,開發人員可以構建出功能豐富、輕便且高效的 BPM 應用程序。git
如今至少要知道有這些對象和接口。並結合Activiti Api這一章節來看,你就會對部署流程、啓動流程、執行任務等操做有一個基本的概念。以後編寫一個簡單的單元測試,主要爲了測試activiti.cfg.xml配置的是否正確,流程是否能夠被部署便可。github
至於與Spring的集成,必定要熟悉基於Spring配置Activiti,以及事務的處理。web
activiti工做流歷史版本下載,更改版本號後在瀏覽器地址欄回車便可spring
https://github.com/Activiti/Activiti/releases/download/activiti-5.16.3/activiti-5.16.3.zipsql
下載後解壓獲得:數據庫
初始化數據庫(本文采用的mysql數據庫)apache
\wars\activiti-explorer.war解壓到tomcat的webapps下,並修改\activiti-explorer\WEB-INF\classes中的db.properties:segmentfault
#db=h2 #jdbc.driver=org.h2.Driver #jdbc.url=jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000 #jdbc.username=sa #jdbc.password= db=mysql jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1/activititest?useUnicode=true&characterEncoding=utf8 jdbc.username=root jdbc.password=123456
訪問首頁,打開瀏覽器輸入http://localhost:8080/activiti-explore,使用用戶kermit,密碼kermit登陸
1.安裝IDEA中編輯Activiti流程的插件actiBPM,安裝完成後重啓IDEA
2.新建一個maven工程,pom.xml文件內容爲:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xuan</groupId> <artifactId>testactiviti</artifactId> <version>1.0-SNAPSHOT</version> <name>testactiviti</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <!--<scope>test</scope>--> </dependency> <!--- Activiti依賴導入 --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring</artifactId> <version>5.22.0</version> </dependency> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-engine</artifactId> <version>5.22.0</version> <exclusions> <exclusion> <artifactId>slf4j-api</artifactId> <groupId>org.slf4j</groupId> </exclusion> <exclusion> <artifactId>spring-beans</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>jackson-core-asl</artifactId> <groupId>org.codehaus.jackson</groupId> </exclusion> <exclusion> <artifactId>commons-lang3</artifactId> <groupId>org.apache.commons</groupId> </exclusion> <exclusion> <artifactId>commons-lang3</artifactId> <groupId>org.apache.commons</groupId> </exclusion> </exclusions> </dependency> <!--MySQL 驅動包,若是是其餘庫的話須要換驅動包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency> </dependencies> </project>
建立資源文件夾resource,並把目錄設置爲Test Resources Root
目錄結構爲
在resource目錄中新建activiti.cfg.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" 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"> <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/testactiviti?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8"></property> <property name="jdbcUsername" value="root"></property> <property name="jdbcPassword" value="123456"></property> <property name="databaseSchemaUpdate" value="true"></property> </bean> </beans>
在resources下面新建一個WorkTest.bpmn文件:
新建以後頁面會變成以下圖所示這樣,中間是畫布,右邊是一些元素,左邊是每一個元素的一些詳細信息,直接拖拽右邊的元素就能夠畫流程了。
畫完流程圖以後能夠更改整個流程的name和元素的name,assignee,
可是畫圖以後,沒有鏈接圖標怎麼辦呢
把鼠標放在開頭的那個圖標上,此時光標的形狀改變了。 拖到另外一個上面,鏈接成功了。
怎麼鏈接成功的呢? 把鼠標放到圖標的正中心,而後會看到光標變成了「扇子類型」的樣子(黑白相間)。只要看到變成這個樣子,就能夠拖動到另外一個圖標中,進行鏈接了
我這裏畫的一個很簡單的流程圖,只用到了startEvent、endEvent和userTask。個人流程是作的訂單的審批。如圖:
畫完圖後,可是並無生成png圖片,這個時候重命名剛纔建立的文件,把後綴改爲xml,而後右鍵
這個時候發現顯示的時候有亂碼:
解決方法:
找到idea安裝目錄bin目錄下以下圖所示兩個文件,用編輯器打開,在文件末尾添加 -Dfile.encoding=UTF-8 ,而後重啓idea,再打開流程圖就會發現中文已經能夠正常顯示了。
解決問題後,把xml文件從新改爲bpmn格式,和png圖片一塊兒壓縮成zip包進行部署。
Activiti提供使用代碼或者配置文件的方式來配置數據庫的信息,新建MyActiviti.java來生成數據庫信息:
public class MyActiviti { @Test public void creatTable() { ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine(); System.out.println("processEngine:"+ processEngine); } @Test public void creatTable2() { ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration(); //鏈接數據庫配置 processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver"); processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8"); 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_CREATE_DROP); //工做流的核心對象,ProcessEngine對象 ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine(); System.out.println("processEngine:"+ processEngine); } }
運行這個類的creatTable或creatTable2以後,自動幫咱們把對應的數據庫表建立起來,有些說23-25張表都是有可能的,我這裏是生成了25張表。
全部的表都以ACT_開頭。 第二部分是表示表的用途的兩個字母標識。 用途也和服務的API對應。
每一個表和字段的具體含義能夠參考:http://www.javashuo.com/article/p-bhlvlsex-hy.html
建表成功以後就能夠開始部署流程了,部署以後就能夠在act_re_procdef表中看到對相應的流程信息.
@Test public void deploy() { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); DeploymentBuilder builder = repositoryService.createDeployment();//建立一個部署的構建器 builder.addClasspathResource("WorkTest.bpmn");//從類路徑中添加資源,一次只能添加一個資源 builder.name("訂單審批"); builder.category("辦公類別"); Deployment deploy = builder.deploy(); System.out.println("部署的id" + deploy.getId()); System.out.println("部署的名稱" + deploy.getName()); }
//查詢流程 @Test public void queryProcdef() { RepositoryService repositoryService = processEngine.getRepositoryService(); //建立查詢對象 ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); //添加查詢條件 //query.processDefinitionKey("myProcess_2");//經過key獲取 // .processDefinitionName("My process")//經過name獲取 query.orderByProcessDefinitionId().asc();//根據ID排序 //執行查詢獲取流程定義明細 List<ProcessDefinition> pds = query.list(); for (ProcessDefinition pd : pds) { System.out.println("ID:" + pd.getId() + ",NAME:" + pd.getName() + ",KEY:" + pd.getKey() + ",VERSION:" + pd.getVersion() + ",RESOURCE_NAME:" + pd.getResourceName() + ",DGRM_RESOURCE_NAME:" + pd.getDiagramResourceName()); } }
@Test public void startProcess() { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //指定執行咱們剛纔部署的工做流程,就是bomn文件定義的流程ID或者名稱 String processDefiKey = "myProcess_1"; //取運行時服務 RuntimeService runtimeService = processEngine.getRuntimeService(); //取得流程實例 ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey);//經過流程定義的key 來執行流程 System.out.println("流程實例id:" + pi.getId());//流程實例id System.out.println("流程定義id:" + pi.getProcessDefinitionId());//輸出流程定義的id }
啓動流程以後就會有相應的任務產生,存在act_ru_task表中,能夠查看任務節點
@Test public void queryTask() { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = processEngine.getTaskService(); //processInstanceId,就是act_ru_task的PROC_INST_ID_ String processInstanceId = "12501"; List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstanceId).list(); //首次運行的時候這個沒有輸出,由於第一次運行的時候掃描act_ru_task的表裏面是空的,但第一次運行完成以後裏面會添加一條記錄,以後每次運行裏面都會添加一條記錄 for (Task task : tasks) { System.out.println("taskId:" + task.getId() + ",taskName:" + task.getName() + ",assignee:" + task.getAssignee() + ",createTime:" + task.getCreateTime()); } }
也能夠根據其它各類條件進行查詢
//查詢流程定義明細 @Test public void queryProcdef() { ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); //建立查詢對象 ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery(); //添加查詢條件 query.processDefinitionKey("myProcess_1");//經過key獲取 // .processDefinitionName("My process")//經過name獲取 // .orderByProcessDefinitionId()//根據ID排序 //執行查詢獲取流程定義明細 List<ProcessDefinition> pds = query.list(); for (ProcessDefinition pd : pds) { System.out.println("ID:" + pd.getId() + ",NAME:" + pd.getName() + ",KEY:" + pd.getKey() + ",VERSION:" + pd.getVersion() + ",RESOURCE_NAME:" + pd.getResourceName() + ",DGRM_RESOURCE_NAME:" + pd.getDiagramResourceName()); } }
//完成任務 @Test public void compileTask(){ ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); String taskId="12504";//任務id,act_ru_task的ID_ processEngine.getTaskService().complete(taskId); System.out.println("當前任務執行完畢"); }
其它還有刪除流程等各類操做,能夠參考http://www.javashuo.com/article/p-pfhgbmjv-cv.html