activiti快速入门--简单请假例子(1)
1. 新建一个maven项目
2. pom.xml文件添加所需依赖:
-
<dependencies> -
<dependency> -
<groupId>org.activiti</groupId> -
<artifactId>activiti-engine</artifactId> -
<version>5.21.0</version> -
</dependency> -
<dependency> -
<groupId>org.activiti</groupId> -
<artifactId>activiti-spring</artifactId> -
<version>5.21.0</version> -
</dependency> -
<dependency> -
<groupId>org.codehaus.groovy</groupId> -
<artifactId>groovy-all</artifactId> -
<version>2.4.3</version> -
</dependency> -
<dependency> -
<groupId>org.slf4j</groupId> -
<artifactId>slf4j-api</artifactId> -
<version>1.7.6</version> -
</dependency> -
<dependency> -
<groupId>org.slf4j</groupId> -
<artifactId>slf4j-jdk14</artifactId> -
<version>1.7.6</version> -
</dependency> -
<dependency> -
<groupId>junit</groupId> -
<artifactId>junit</artifactId> -
<version>3.8.1</version> -
<scope>test</scope> -
</dependency> -
<dependency> -
<groupId>mysql</groupId> -
<artifactId>mysql-connector-java</artifactId> -
<version>5.1.38</version> -
</dependency> -
</dependencies>
3. 创建activiti数据表,具体操作如下:
1) 创建配置文件:activiti.cfg.xml,添加以下代码:(我用的是mysql数据库)
-
<?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.StandaloneInMemProcessEngineConfiguration"> -
<property name="databaseSchemaUpdate" value="true"/> -
<property name="jdbcUrl"value="jdbc:mysql://localhost/activiti?useUnicode=true&characterEncoding=UTF-8"/> -
<property name="jdbcDriver"value="com.mysql.jdbc.Driver" /> -
<property name="jdbcUsername"value="root" /> -
<property name="jdbcPassword"value="" /> -
<!-- Databaseconfigurations --> -
<!--<property name="databaseSchemaUpdate" value="true" />--> -
<!-- jobexecutor configurations --> -
<!--<property name="jobExecutorActivate" value="false" />--> -
</bean> -
</beans>
2) 写CreateTable.java创建表,代码如下:
-
publicclass CreateTable { -
@Test -
publicvoid createTable(){ -
ProcessEngine processEngine = -
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml") -
.buildProcessEngine(); -
System.out.println("processEngine="+processEngine); -
} -
}
3) 跑下上面代码就可以了,数据库中会多出25张数据表
4. 创建process.bpmn画流程图:(简单画一个请假例子,填写基本信息key和name,添加一个开始事件和结束事件Event:StartEvent、EndEvent,以及添加两个Task事件:UserTask)
点击对应task分配任务人assignee,在main config下填写:
该bpmn文件选择用xml形式打开的话,生成上面所画的代码如下:
-
<?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="HelloWorldKey" name="HelloWorldName" isExecutable="true"> -
<startEvent id="startevent1" name="Start"> -
<extensionElements> -
<activiti:executionListener event="start" class="com.cwh.activiti.TaskListenerImpl"></activiti:executionListener> -
</extensionElements> -
</startEvent> -
<userTask id="usertask1" name="申请" activiti:assignee="cwh"> -
<extensionElements> -
<activiti:taskListener event="create" class="com.cwh.activiti.TaskListenerImpl"></activiti:taskListener> -
</extensionElements> -
</userTask> -
<userTask id="usertask2" name="经理审批" activiti:assignee="menco"> -
<extensionElements> -
<activiti:taskListener event="create" class="com.cwh.activiti.TaskListenerImpl"></activiti:taskListener> -
</extensionElements> -
</userTask> -
<endEvent id="endevent1" name="End"></endEvent> -
<sequenceFlow id="flow1" sourceRef="startevent1"targetRef="usertask1"></sequenceFlow> -
<sequenceFlow id="flow2" sourceRef="usertask1"targetRef="usertask2"></sequenceFlow> -
<sequenceFlow id="flow3" sourceRef="usertask2"targetRef="endevent1"></sequenceFlow> -
</process> -
<bpmndi:BPMNDiagram id="BPMNDiagram_HelloWorldKey"> -
<bpmndi:BPMNPlane bpmnElement="HelloWorldKey" id="BPMNPlane_HelloWorldKey"> -
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"> -
<omgdc:Bounds height="35.0"width="35.0" x="260.0"y="40.0"></omgdc:Bounds> -
</bpmndi:BPMNShape> -
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"> -
<omgdc:Bounds height="55.0"width="105.0" x="225.0"y="100.0"></omgdc:Bounds> -
</bpmndi:BPMNShape> -
<bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2"> -
<omgdc:Bounds height="55.0"width="105.0" x="225.0"y="200.0"></omgdc:Bounds> -
</bpmndi:BPMNShape> -
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"> -
<omgdc:Bounds height="35.0"width="35.0" x="260.0"y="310.0"></omgdc:Bounds> -
</bpmndi:BPMNShape> -
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"> -
<omgdi:waypoint x="277.0"y="75.0"></omgdi:waypoint> -
<omgdi:waypoint x="277.0"y="100.0"></omgdi:waypoint> -
</bpmndi:BPMNEdge> -
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"> -
<omgdi:waypoint x="277.0"y="155.0"></omgdi:waypoint> -
<omgdi:waypoint x="277.0"y="200.0"></omgdi:waypoint> -
</bpmndi:BPMNEdge> -
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3"> -
<omgdi:waypoint x="277.0"y="255.0"></omgdi:waypoint> -
<omgdi:waypoint x="277.0"y="310.0"></omgdi:waypoint> -
</bpmndi:BPMNEdge> -
</bpmndi:BPMNPlane> -
</bpmndi:BPMNDiagram> -
</definitions>
5. 好了下面开始真正的流程操作了,我们创建一个operate.java文件来操作流程,具体步骤如下:
1)部署我们创建的bpmn流程如到数据库中:(运行后:在act_re_deployment流程部署表和act_re_procdef流程定义表中会有对应的数据信息)
-
private static ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine(); -
@Test -
public void delployFlow(){ -
Deploymentdeployment = processEngine.getRepositoryService() -
.createDeployment() -
.name("helloworld") -
.addClasspathResource("Process.bpmn") -
.addClasspathResource("Process.png") -
.deploy(); -
System.out.println(deployment.getId()); -
System.out.println(deployment.getName()); -
}
补充下:
上面中的png文件,如果保存bpmn不会自动生成PNG文件的话可以以下操作:
Window->preferences->activity->saveaction->把create process这个选择框勾上;
解释下ProcessEngine这个类,在Activiti中最核心的类,其他的类都是由他而来,例如:
上面的processEngine.getRepositoryService()//管理流程定义
1.1 RuntimeService :是activiti的流程执行服务类,可以从这个服务类中获取很多关于流程执行的相关的信息。
1.2 TaskService是activiti的任务服务类。可以从这个类中获取任务的相关信息,如当前正在执行的个人待办和用户组待办任务。
1.3 HistoryService是activiti的查询历史信息的类,在一个流程执行完成后,这个对象为我们提供查询历史信息,可以跟踪流程实例对应所有待办节点的运行情况。
1.4 ProcessDefinition流程定义类,可以从这里获得资源文件等。
1.5 ProcessInstance代表流程定义的执行实例,当一个部署的流程图启动后,该流程只有一条流程实例数据,但是它的流程任务可以有多个,每个任务对应流程图中相应的流程节点。
2)接着上面后开启流程:
-
@Test -
publicvoid flowStart(){ -
RuntimeServiceruntimeService = processEngine.getRuntimeService(); -
//用key启动时按照最新的流程图版本定义启动 -
ProcessInstanceprocessInstance = runtimeService.startProcessInstanceByKey("HelloWorldKey"); -
}
补充:
其中runtimeService.startProcessInstanceByKey("HelloWorldKey")中的HelloWorldKey对应流程图中的ID值,在数据表中对应act_re_procdef流程定义表中的key字段
启动完流程后在act_ru_execution表中会产生一条数据,这条数据为当前流程正在执行的任务,其中act_id_字段的值对应流程图节点的ID值在act_ru_task表中会产生一条任务数据,execution_id_对应act_ru_execution主键,proc_inst_id_为流程实例ID,name_值为流程节点名称,assignee_字段为该待办当前的处理人(也就是上面我们在画流程图中所设置的cwh)
3)查询下任务人所有的任务:
-
@Test -
publicvoid findMyPersonTask(){ -
Stringassignee = "cwh"; -
List<Task>taskList= processEngine.getTaskService()//获取任务service -
.createTaskQuery()//创建查询对象 -
.taskAssignee(assignee)//指定查询人 -
.list(); -
if(taskList.size()>0){ -
for (Task task : taskList){ -
System.out.println("代办任务ID:"+task.getId()); -
System.out.println("代办任务name:"+task.getName()); -
System.out.println("代办任务创建时间:"+task.getCreateTime()); -
System.out.println("代办任务办理人:"+task.getAssignee()); -
System.out.println("流程实例ID:"+task.getProcessInstanceId()); -
System.out.println("执行对象ID:"+task.getExecutionId()); -
} -
} -
}
4) 提交任务到下一个任务人(也就是提交我们的申请到经理手中去)
-
@Test -
publicvoid completeTask(){ -
StringtaskId = "17504"; processEngine.getTaskService().complete(taskId);//完成任务 -
System.out.println("完成任务,任务ID"+taskId); -
}
补充:taskId对应上面数据表act_ru_task中所生成的ID,也就是我们上面通过cwh查询出来的任务id,提交后该笔任务就到了下一个人手上(也就是经理,我们上面设置的assignee ‘menco’)那么我们查询下menco的任务信息,调用上面3)写的findMyPersonTask():改查询条件assignee为‘menco’
5) 经理拿到该条申请后,进行审批然后提交之后那么该笔任务流程也就结束了
-
@Test -
publicvoid completeTask1(){ -
Stringtaskid = "20002"; -
TaskServicetaskService = processEngine.getTaskService(); -
processEngine.getTaskService().complete(taskid);//完成任务 -
System.out.println("完成任务,任务ID"+taskid);