一,pom文件引入jar包(如下是完整的pom文件)
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.activiti</groupId>
<artifactId>activi01</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>activi01 Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<activiti.version>7.0.0.Beta1</activiti.version>
<log4j.version>1.2.12</log4j.version>
<slf4j.version>1.6.6</slf4j.version>
</properties>
<dependencies>
<!-- activiti,mysql,mybatis,log4j,数据库连接池的包 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- 模型处理 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bgmn 转换 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn 转换 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-json-converter</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- bpmn 布局 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-layout</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- activiti 云支持 -->
<dependency>
<groupId>org.activiti.cloud</groupId>
<artifactId>activiti-cloud-services-api</artifactId>
<version>${activiti.version}</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
</dependencies>
<build>
<finalName>activi01</finalName>
</build>
</project>
二,创建bpmn文件evection.bpmn
请提前安装bpmn插件
ecevtion.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="myEvection" name="出差申请" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="创建出差申请" activiti:assignee="zhangsan"></userTask>
<userTask id="usertask2" name="经理审批" activiti:assignee="Jerry"></userTask>
<userTask id="usertask3" name="总经理审批" activiti:assignee="jack"></userTask>
<userTask id="usertask4" name="财务审批" activiti:assignee="rose"></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="usertask3"></sequenceFlow>
<sequenceFlow id="flow4" sourceRef="usertask3" targetRef="usertask4"></sequenceFlow>
<sequenceFlow id="flow5" sourceRef="usertask4" targetRef="endevent1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_myEvection">
<bpmndi:BPMNPlane bpmnElement="myEvection" id="BPMNPlane_myEvection">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="365.0" y="191.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="330.0" y="332.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
<omgdc:Bounds height="55.0" width="105.0" x="330.0" y="470.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
<omgdc:Bounds height="55.0" width="105.0" x="330.0" y="580.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask4" id="BPMNShape_usertask4">
<omgdc:Bounds height="55.0" width="105.0" x="330.0" y="690.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="365.0" y="820.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="382.0" y="226.0"></omgdi:waypoint>
<omgdi:waypoint x="382.0" y="332.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="382.0" y="387.0"></omgdi:waypoint>
<omgdi:waypoint x="382.0" y="470.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
<omgdi:waypoint x="382.0" y="525.0"></omgdi:waypoint>
<omgdi:waypoint x="382.0" y="580.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
<omgdi:waypoint x="382.0" y="635.0"></omgdi:waypoint>
<omgdi:waypoint x="382.0" y="690.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow5" id="BPMNEdge_flow5">
<omgdi:waypoint x="382.0" y="745.0"></omgdi:waypoint>
<omgdi:waypoint x="382.0" y="820.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
注意:保存bpmn文件会自动生成一个同名后缀为.png的文件(生成图片比较慢),如果不能生成请检查配置。
三.创建activiti.cfg.xml和log4j.properties文件
activiti.cfg.xml
注:请先新建一个activiti的数据库
<?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 -->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/activiti?useSSL=false&serverTimezone=UTC" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="123456" />
<!-- activiti数据库表生成策略,true表示如果数据库中已存在相应的表,那么直接使用,如果不存在,那么会创建 -->
<property name="databaseSchemaUpdate" value="true" />
<!--
<property name="createDiagramOnDeploy" value="false" />
-->
</bean>
</beans>
log4j.properties
log4j.rootCategory=debug,CONSOLE,LOGFILE
log4j.logger.org.apache.axis.enterprise=FATAL,CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c{1}:%L] - %m%n
log4j.appender.CONSOLE.Encoding=UTF-8
log4j.appender.CONSOLE.threshold=INFO
#将WARN等级的错误日志输出到每天目录,每天一个文件
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.File=logs/act/activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c{1}:%L] - %m%n
log4j.appender.LOGFILE.Encoding=UTF-8
四,创建junit4测试类
package com.activiti01;
import java.util.List;
import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricActivityInstanceQuery;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class ActivitiDemo {
/**
* 测试流程部署
*/
@Test
public void testDeployment() {
// 1 创建 ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2 获取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3使用 service进行流程部署,定义一个流程的名字,把bpmn和png文件部署到数据库
Deployment deployment = repositoryService.createDeployment().name("出差申请流程")
.addClasspathResource("bpmn/evection.bpmn").addClasspathResource("bpmn/evection.png").deploy();
// 4 (非必须)输出部署信息
System.out.println("流程部署的id=" + deployment.getId());
System.out.println("流程部署的name=" + deployment.getName());
}
/**
* 启动流程实例 <br>
* act_hi_actinst 流程实例执行的历史<br>
* act_hi_indentitylink 流程参与者的历史信息 <br>
* act_hi_procinst 流程实例的历史信息 <br>
* act_hi_taskinst 任务的历史信息 <br>
* act_ru_execution 流程执行的信息 <br>
* act_ru_indentitylink 流程参与者信息 <br>
* act_ru_task 任务信息 <br>
*
*/
@Test
public void testStartProcess() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance instance = runtimeService.startProcessInstanceByKey("myEvection");
System.out.println("流程定义的ID:" + instance.getProcessDefinitionId());
System.out.println("流程实例的ID:" + instance.getId());
System.out.println("当前活动的ID:" + instance.getActivityId());
}
/**
* 查询个人待执行的任务
*/
@Test
public void testFindPersonalTaskList() {
// 1 获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2 获取taskService
TaskService taskService = processEngine.getTaskService();
// 3 根据流程的key和任务的负责人 查询任务
List<Task> list = taskService.createTaskQuery().processDefinitionKey("myEvection").taskAssignee("zhangsan")
.list();
// 4 输出
for (Task task : list) {
System.out.println("流程实例的ID=" + task.getProcessInstanceId());
System.out.println("任务的ID=" + task.getId());
System.out.println("任务负责人=" + task.getAssignee());
System.out.println("任务名称=" + task.getName());
}
}
/**
* 完成个人任务
*/
@Test
public void completTask() {
// 1 获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2 获取taskService
TaskService taskService = processEngine.getTaskService();
// 3 根据任务id完成任务
taskService.complete("2505");
}
/**
* 历史审批流程
*/
@Test
public void test2() {
// 创建ProcessEngineConfiguration对象
ProcessEngineConfiguration configuration = ProcessEngineConfiguration
.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
// 获取ProcessEngine对象
ProcessEngine processEngine = configuration.buildProcessEngine();
// 获取HistoryService对象
HistoryService historyService = processEngine.getHistoryService();
// 获取HistoricActivityInstanceQuery查询对象
HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService
.createHistoricActivityInstanceQuery();
List<HistoricActivityInstance> historicActivityInstanceList = historicActivityInstanceQuery.list();
for (HistoricActivityInstance historicActivityInstance : historicActivityInstanceList) {
String activityId = historicActivityInstance.getActivityId();
System.out.println("activityId = " + activityId);
String activityName = historicActivityInstance.getActivityName();
System.out.println("activityName = " + activityName);
String processDefinitionId = historicActivityInstance.getProcessDefinitionId();
System.out.println("processDefinitionId = " + processDefinitionId);
String processInstanceId = historicActivityInstance.getProcessInstanceId();
System.out.println("processInstanceId = " + processInstanceId);
System.out.println("----------------");
}
}
@Test
public void test() {
System.out.println("Test");
}
}