上次說道Activiti集成了Maven環境,此次用Activiti來跑一下項目。java
新建一個簡單Activiti項目,以下圖所示:mysql
項目結構spring
在項目結構中,須要在resource裏放入activiti.cfg.xml文件,此文件是activiti的配置文件,利用此配置文件能夠構造關於Activiti的24張表,Activiti中的全部操做都是在這24張表之中進行的。有兩種構建方式能夠配置activiti.cfg.xml。以下:sql
activiti.cfg.xml數據庫
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" 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-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration .createStandaloneProcessEngineConfiguration(); // 鏈接數據庫的配置 processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver"); processEngineConfiguration .setJdbcUrl("jdbc:mysql://localhost:3306/testactiviti?useUnicode=true&characterEncoding=utf8"); processEngineConfiguration.setJdbcUsername("****"); processEngineConfiguration.setJdbcPassword("****"); // Activiti的24個表不存在則自動建立 processEngineConfiguration .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); --> <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"></property> <property name="jdbcUsername" value="****"></property> <property name="jdbcPassword" value="****"></property> <property name="databaseSchemaUpdate" value="true"></property> </bean> </beans>
如今開始設計一個流程,能夠用activiti插件中的圖標bpmn繪製工具,使用方法,新建-->other-->Activiti Diagram-->選擇你須要繪製的路徑,這裏,咱們將其放在了resource目錄下面的diagrams之中了。express
建好bpmn文件以後,開始繪圖,使用右側的繪圖工具繪製一個流程圖。apache
繪製好基本圖形了,分別對每一個元素進行屬性設置,這裏能夠更改屬性中的General的Name值,以及Main-config下面的Assignee值(辦理人)。這樣,每一個流程都有本身的名稱,ID,和辦理人了,這就是一個完整的流程。保存此流程,就能夠在其目錄下生成一張相同名稱的png流程圖片,打開圖片,便是本身繪製的流程示意圖。瀏覽器
固然,這個bpmn文件也能夠不使用Activiti視圖打開,可使用xml瀏覽器方式進行打開,出現的是xml結構的流程說明,在這裏,我貼上本身的bpmn文件結構記錄:工具
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> <process id="helloworld" name="helloworldName" isExecutable="true"> <startEvent id="startevent1" name="Start"></startEvent> <endEvent id="endevent1" name="End"></endEvent> <userTask id="usertask1" name="提交申請" activiti:assignee="張三"></userTask> <userTask id="usertask2" name="部門經理審批" activiti:assignee="李四"></userTask> <userTask id="usertask3" name="總經理審批" activiti:assignee="王五"></userTask> <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow> <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow> <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow> <sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow> </process> <bpmndi:BPMNDiagram id="BPMNDiagram_helloworld"> <bpmndi:BPMNPlane bpmnElement="helloworld" id="BPMNPlane_helloworld"> <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> <omgdc:Bounds height="35.0" width="35.0" x="130.0" y="30.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> <omgdc:Bounds height="35.0" width="35.0" x="130.0" y="420.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"> <omgdc:Bounds height="55.0" width="105.0" x="95.0" y="100.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2"> <omgdc:Bounds height="55.0" width="105.0" x="95.0" y="200.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3"> <omgdc:Bounds height="55.0" width="105.0" x="95.0" y="300.0"></omgdc:Bounds> </bpmndi:BPMNShape> <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> <omgdi:waypoint x="147.0" y="65.0"></omgdi:waypoint> <omgdi:waypoint x="147.0" y="100.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> <omgdi:waypoint x="147.0" y="155.0"></omgdi:waypoint> <omgdi:waypoint x="147.0" y="200.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> <omgdi:waypoint x="147.0" y="255.0"></omgdi:waypoint> <omgdi:waypoint x="147.0" y="300.0"></omgdi:waypoint> </bpmndi:BPMNEdge> <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4"> <omgdi:waypoint x="147.0" y="355.0"></omgdi:waypoint> <omgdi:waypoint x="147.0" y="420.0"></omgdi:waypoint> </bpmndi:BPMNEdge> </bpmndi:BPMNPlane> </bpmndi:BPMNDiagram> </definitions>
當配置文件寫好、流程圖繪製完畢後,就能夠直接上代碼進行測試了:測試
ActivitiDemo.java
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.apache.commons.io.*; import org.junit.Test; public class ActivitiDemo { ProcessEngine pe=ProcessEngines.getDefaultProcessEngine(); /**部署流程定義*/ @Test public void deploymentProcessDefinition(){ Deployment deploye=pe.getRepositoryService()//與流程定義和部署對象的Service .createDeployment()//建立一個部署對象 .name("部署名稱") .addClasspathResource("diagrams/MyProcess.bpmn")//從classpath加載,一次只能加載一個文件 .addClasspathResource("diagrams/MyProcess.png") .deploy(); System.out.println(deploye.getId()); System.out.println(deploye.getName()); } }
這一個測試就是針對這個流程最開始的啓動工做來作的。啓動完畢後,會在數據庫中獲得24張表。目前在這個流程中,因爲這個流程是單線操做,因此存在一個流程實例,一個流程對象。ProcessEngine是整個流程管理的核心,經過引擎來管理全部的流程操做,在這裏,流程引擎經過ProcessEngines.getDefaultProcessEngine()方法得到;引擎中建立了各類操做流程的Service,包括:
ResponsitoryService:管理流程定義
RuntimeService:執行管理定義
TaskService:任務管理定義
HistoryService:歷史管理定義
IdentityService:組織機構管理定義
FormService:任務表單管理定義
執行測試方法,能夠將其打印出來,其中5001是流程ID,流程名稱則是在建立流程時賦予的名稱。這個部署完畢,就會在數據庫中act_re_deployment(流程表)表中留下一條記錄。
5001 部署名稱
部署流程定義後,須要將其實例化,須要啓動流程實例,測試代碼爲:
@Test public void startProcessInstance(){ ProcessInstance processInstance=pe.getRuntimeService()//啓動相關的Service .startProcessInstanceByKey("helloworld");//經過流程Key啓動,key對應的是bpmn文件中的ID屬性 System.out.println("流程實例ID"+processInstance.getId()); System.out.println("流程定義ID"+processInstance.getProcessDefinitionId()); }
流程實例ID7501 流程定義IDhelloworld:3:5004
這樣就獲取了一個流程實例,在流程實例表中能夠看到增長了一條數據,說明這個流程開始啓動了:
流程實例啓動後,咱們的研究對象就從流程實例轉到流程對象了,流程對象能夠在act_ru_execution(流程對象表)中查看,能夠在任務表中查詢到相應的歷史任務(act_hi_taskinst)和正在進行的任務(act_ru_task),能夠看到流程的進展狀況;能夠看到任務流程在開始後已經變成了「提交申請」,轉給了辦理人 張三。
流程對象表:
任務表:
固然,這寫查詢的操做能夠用java完成,咱們在任務表中看到當前有一個任務記錄,辦理人Assignee是張三,這個是在bpmn表中定義好了的。能夠用java語句來審批一下任務,讓工做流繼續傳遞下去,下面就是查詢我的任務並完成我的任務的寫法;
/**查詢當前人的我的任務*/ @Test public void findProcessTask(){ List<Task> t=pe.getTaskService() .createTaskQuery() .taskAssignee("張三") .list(); if(t!=null&&t.size()>0){ for(Task task:t){ 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());//流程實例ID System.out.println("執行對象ID"+task.getExecutionId());//流程實例ID System.out.println("流程定義ID"+task.getProcessDefinitionId());//流程實例ID } } }
任務ID7504 任務名稱提交申請 Tue Jan 30 16:19:43 CST 2018 辦理人張三 流程實例ID7501 執行對象ID7501 流程定義IDhelloworld:3:5004
能夠將此任務的狀態設置爲完成,在java中的測試代碼爲
/**完成任務*/ @Test public void completeTask(){ pe.getTaskService() .complete("7504"); }
這是若是打開任務表,就會發現任務已經由張三轉爲李四了,代表張三的提交審批任務已經完成,當前的任務會轉給李四,能夠在ru_task表中證明;
同理,獲取當前任務的ID後,完成任務,就會講此任務轉給王五,依此類推,直至流程結束。
完成流程後,能夠在hi_taskinst表(歷史任務表)中查看到完成的任務記錄
也能夠在hi_procinst(歷史流程表)中看到流程記錄,能夠看到這是一個善始善終的項目,包含有start_time,end_time;
5、附
這是一個Activiti的邏輯說明例子,在實際項目中,任務辦理人不會直接寫死在bpmn中,各類任務的ID,辦理人等也會由程序獲取,而且關聯在一塊兒。