接上文,本文主要講述如何使用Activiti搭建一個(gè)簡單的工程。
首先就是下載Activiti5.9的官方文件,下載地址見:http://activiti.org/download.html,新建一個(gè)Java工程導(dǎo)入相關(guān)的JAR包,安裝Activiti的插件。因?yàn)閱我坏膬H使用Activiti的項(xiàng)目在現(xiàn)實(shí)生活中幾乎不存在,所以本文中的項(xiàng)目還是集成了Spring框架,所需要的JAR包截圖如下:
新建一個(gè)Java Project,在該項(xiàng)目中新建一個(gè)Activiti Process,打開插件面板。
這里模擬的流程是某公司的實(shí)習(xí)生招聘流程:
新建一個(gè)開始節(jié)點(diǎn):
最終的結(jié)果圖如下:
該步驟會自動(dòng)生成相應(yīng)的bpmn2.0文件,如圖所示:
接下來就是創(chuàng)建配置文件了:
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="databaseSchemaUpdate" value="true" /> <property name="jdbcUrl" value="jdbc:mysql://localhost:9906/activiti" /> <property name="jdbcDriver" value="com.mysql.jdbc.Driver" /> <property name="jdbcUsername" value="root" /> <property name="jdbcPassword" value="root" /> <property name="jobExecutorActivate" value="true" /> </bean></beans>
測試類:
InterviewTest.java
package com.activiti04;import java.util.List;import org.activiti.engine.HistoryService;import org.activiti.engine.ProcessEngine;import org.activiti.engine.ProcessEngineConfiguration;import org.activiti.engine.RepositoryService;import org.activiti.engine.RuntimeService;import org.activiti.engine.TaskService;import org.activiti.engine.history.HistoricProcessInstance;import org.activiti.engine.task.Task;public class InterviewTest { //本流程模擬的是某公司2012年實(shí)習(xí)生招聘流程 public static void main(String[] args) { //加載配置文件 ProcessEngine processEngine = ProcessEngineConfiguration .createProcessEngineConfigurationFromResource("activiti.cfg.xml") .buildProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); RuntimeService runtimeService = processEngine.getRuntimeService(); repositoryService.createDeployment() .addClasspathResource("main/resources/diagrams/Interview.bpmn20.xml") .deploy(); String processId = runtimeService.startProcessInstanceByKey("Interview").getId(); TaskService taskService = processEngine.getTaskService(); //得到筆試的流程 System.out.println("***************筆試流程開始***************"); List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("人力資源部").list(); for (Task task : tasks) { System.out.println("人力資源部的任務(wù):name:"+task.getName()+",id:"+task.getId()); taskService.claim(task.getId(), "張三"); } System.out.println("張三的任務(wù)數(shù)量:"+taskService.createTaskQuery().taskAssignee("張三").count()); tasks = taskService.createTaskQuery().taskAssignee("張三").list(); for (Task task : tasks) { System.out.println("張三的任務(wù):name:"+task.getName()+",id:"+task.getId()); taskService.complete(task.getId()); } System.out.println("張三的任務(wù)數(shù)量:"+taskService.createTaskQuery().taskAssignee("張三").count()); System.out.println("***************筆試流程結(jié)束***************"); System.out.println("***************一面流程開始***************"); tasks = taskService.createTaskQuery().taskCandidateGroup("技術(shù)部").list(); for (Task task : tasks) { System.out.println("技術(shù)部的任務(wù):name:"+task.getName()+",id:"+task.getId()); taskService.claim(task.getId(), "李四"); } System.out.println("李四的任務(wù)數(shù)量:"+taskService.createTaskQuery().taskAssignee("李四").count()); for (Task task : tasks) { System.out.println("李四的任務(wù):name:"+task.getName()+",id:"+task.getId()); taskService.complete(task.getId()); } System.out.println("李四的任務(wù)數(shù)量:"+taskService.createTaskQuery().taskAssignee("李四").count()); System.out.println("***************一面流程結(jié)束***************"); System.out.println("***************二面流程開始***************"); tasks = taskService.createTaskQuery().taskCandidateGroup("技術(shù)部").list(); for (Task task : tasks) { System.out.println("技術(shù)部的任務(wù):name:"+task.getName()+",id:"+task.getId()); taskService.claim(task.getId(), "李四"); } System.out.println("李四的任務(wù)數(shù)量:"+taskService.createTaskQuery().taskAssignee("李四").count()); for (Task task : tasks) { System.out.println("李四的任務(wù):name:"+task.getName()+",id:"+task.getId()); taskService.complete(task.getId()); } System.out.println("李四的任務(wù)數(shù)量:"+taskService.createTaskQuery().taskAssignee("李四").count()); System.out.println("***************二面流程結(jié)束***************"); System.out.println("***************HR面流程開始***************"); tasks = taskService.createTaskQuery().taskCandidateGroup("人力資源部").list(); for (Task task : tasks) { System.out.println("技術(shù)部的任務(wù):name:"+task.getName()+",id:"+task.getId()); taskService.claim(task.getId(), "李四"); } System.out.println("李四的任務(wù)數(shù)量:"+taskService.createTaskQuery().taskAssignee("李四").count()); for (Task task : tasks) { System.out.println("李四的任務(wù):name:"+task.getName()+",id:"+task.getId()); taskService.complete(task.getId()); } System.out.println("李四的任務(wù)數(shù)量:"+taskService.createTaskQuery().taskAssignee("李四").count()); System.out.println("***************HR面流程結(jié)束***************"); System.out.println("***************錄用流程開始***************"); tasks = taskService.createTaskQuery().taskCandidateGroup("人力資源部").list(); for (Task task : tasks) { System.out.println("技術(shù)部的任務(wù):name:"+task.getName()+",id:"+task.getId()); taskService.claim(task.getId(), "李四"); } System.out.println("李四的任務(wù)數(shù)量:"+taskService.createTaskQuery().taskAssignee("李四").count()); for (Task task : tasks) { System.out.println("李四的任務(wù):name:"+task.getName()+",id:"+task.getId()); taskService.complete(task.getId()); } System.out.println("李四的任務(wù)數(shù)量:"+taskService.createTaskQuery().taskAssignee("李四").count()); System.out.println("***************錄用流程結(jié)束***************"); HistoryService historyService = processEngine.getHistoryService(); HistoricProcessInstance historicProcessInstance = historyService .createHistoricProcessInstanceQuery() .processInstanceId(processId).singleResult(); System.out.println("流程結(jié)束時(shí)間:"+historicProcessInstance.getEndTime()); System.exit(0); }}
然后執(zhí)行即可,結(jié)果如下:
***************筆試流程開始***************人力資源部的任務(wù):name:筆試,id:307張三的任務(wù)數(shù)量:1張三的任務(wù):name:筆試,id:307張三的任務(wù)數(shù)量:0***************筆試流程結(jié)束******************************一面流程開始***************技術(shù)部的任務(wù):name:技術(shù)一面,id:310李四的任務(wù)數(shù)量:1李四的任務(wù):name:技術(shù)一面,id:310李四的任務(wù)數(shù)量:0***************一面流程結(jié)束******************************二面流程開始***************技術(shù)部的任務(wù):name:技術(shù)二面,id:313李四的任務(wù)數(shù)量:1李四的任務(wù):name:技術(shù)二面,id:313李四的任務(wù)數(shù)量:0***************二面流程結(jié)束******************************HR面流程開始***************技術(shù)部的任務(wù):name:HR面,id:316李四的任務(wù)數(shù)量:1李四的任務(wù):name:HR面,id:316李四的任務(wù)數(shù)量:0***************HR面流程結(jié)束******************************錄用流程開始***************技術(shù)部的任務(wù):name:錄用,發(fā)放Offer,id:319李四的任務(wù)數(shù)量:1李四的任務(wù):name:錄用,發(fā)放Offer,id:319李四的任務(wù)數(shù)量:0***************錄用流程結(jié)束***************流程結(jié)束時(shí)間:Tue May 15 17:44:26 CST 2012
至此,該項(xiàng)目結(jié)束,項(xiàng)目源碼放在附件中。