標籤:
引言
Activiti工作引擎,用我的話說:簡單的就是將商務程序和系統流程分離的架構。
有人問了,我們其實用資料庫的幾張表,就可以實現,提交我們的資訊給指定的下一個人。為什麼我們還要用Activiti呢?這個問題,其實很簡單,Activiti將我們的商務程序和系統流程分離,簡單來講,就是我們只需要提交我們的資訊就行了,不需要知道審批人是誰。這樣解耦和。
不多說了,上代碼:
先看我們的檔案目錄:
一、引用jar包:
其中比較重要的包:
二、畫bpmn檔案:
三、填寫各個節點的參數:
我們在提交申請的Properties--Main config 中的Assignee中寫入“張三”,例如:
同樣的方式,我們在“審批【部門經理】”節點中Properties--Main Config--Assiginee中寫入“李四”。
同樣的方式,我們在“審批【總經理】”節點中Properties--Main Config--Assiginee中寫入“王五”。
四、設定Process的ID:
寫好了之後,我們點擊空白bpmn檔案空白的地方,
五、寫xml和類
寫activiti.cfg.xml檔案:
<span style="font-size:18px;"><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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://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/itcast0711activiti?useUnicode=true&characterEncoding=utf8"></property><property name="jdbcUsername" value="root"></property><property name="jdbcPassword" value="root"></property><!-- 沒有表建立表 --><property name="databaseSchemaUpdate" value="true"></property></bean></beans></span>
添加log4j.properties檔案:
<span style="font-size:18px;">log4j.rootLogger=INFO, CA# ConsoleAppenderlog4j.appender.CA=org.apache.log4j.ConsoleAppenderlog4j.appender.CA.layout=org.apache.log4j.PatternLayoutlog4j.appender.CA.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n</span>
寫HelloWorld類:
<span style="font-size:18px;">package cn.itcast.a_helloworld;import java.util.List;import org.activiti.engine.ProcessEngine;import org.activiti.engine.ProcessEngines;import org.activiti.engine.repository.Deployment;import org.activiti.engine.runtime.ProcessInstance;import org.activiti.engine.task.Task;import org.junit.Test;public class HelloWorld {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();/**部署流程定義*/@Testpublic void deploymentProcessDefinition(){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());//1System.out.println("部署名稱:"+deployment.getName());//helloworld入門程式 }/**啟動流程執行個體*/@Testpublic void startProcessInstance(){//流程定義的keyString processDefinitionKey = "helloworld";ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程執行個體和執行對象相關的Service.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動流程執行個體,key對應helloworld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動System.out.println("流程執行個體ID:"+pi.getId());//流程執行個體ID 101System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4}/**查詢當前人的個人任務*/@Testpublic void findMyPersonalTask(){String assignee = "王五";List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service.createTaskQuery()//建立任務查詢對象.taskAssignee(assignee)//指定個人任務查詢,指定辦理人.list();if(list!=null && list.size()>0){for(Task task:list){System.out.println("任務ID:"+task.getId());System.out.println("任務名稱:"+task.getName());System.out.println("任務的建立時間:"+task.getCreateTime());System.out.println("任務的辦理人:"+task.getAssignee());System.out.println("流程執行個體ID:"+task.getProcessInstanceId());System.out.println("執行對象ID:"+task.getExecutionId());System.out.println("流程定義ID:"+task.getProcessDefinitionId());System.out.println("########################################################");}}}/**完成我的工作*/@Testpublic void completeMyPersonalTask(){//任務IDString taskId = "302";processEngine.getTaskService()//與正在執行的任務管理相關的Service.complete(taskId);System.out.println("完成任務:任務ID:"+taskId);}}</span>
註:
第一個方法deploymentProcessDefinition方法是用來部署流程的,部署流程的意思是說,我們新寫了一個工作流程的執行個體,運行deploymentProcessDefinition方法,該工作流程執行個體,就會部署。部署只需要一次就可以了。
第二個方法startProcessInstance()是啟動流程執行個體的方法,這裡的processDefinitionKey一定是我們先前的Properties——process——id必須保持一致,因為這個ProcessDefinitionkey就是根據這個值來尋找執行個體那個部署的流程的。
第三個方法findMyPersonalTask()尋找個人任務,這裡需要的Assignee是我們在畫圖的時候,在Properties——Main Config——Assignee中的名稱保持一致,這裡查看“王五”的個人任務,也就是說,當張三提交申請時候,Assignee為“李四”的時候,就會出現李四的任務,李四完成任務,就提交給王五,這個時候,王五就會出現有任務。
第四個方法completeMyPersonalTask()完成任務,這個參數為taskID,也就是說,第三個方法中現查詢了是否有任務,當存在任務的時候,我們就將任務的ID為參數,運行這個方法任務就會完成。
Activiti系列(一)——最簡單的Activiti程式