1.不多说了直接上代码。都有注释。希望对新学习的小伙伴有所帮助。
package cn.com.agree.testactiviti;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@WebMvcTest(TestActivitiController.class)
public class TestActivitiController {
/**部署流程定义*/
@Test
public void deploymentProcessDefinition(){
//数据库连接
ProcessEngineConfiguration config = ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration();
config.setJdbcDriver("com.mysql.jdbc.Driver");
config.setJdbcUrl("jdbc:mysql://localhost:3306/activiti-demo?useUnicode=true&characterEncoding=utf8");
config.setJdbcUsername("root");
config.setJdbcPassword("root");
/*
DB_SCHEMA_UPDATE_FALSE 不能创建表,需要表存在
DB_SCHEMA_UPDATE_TRUE 先删除表再创建表
DB_SCHEMA_UPDATE_TRUE 如表不存在自动创建表
*/
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine processEngine=config.buildProcessEngine();
//与流程定义和部署对象相关的Service
RepositoryService repositoryService=processEngine.getRepositoryService();
DeploymentBuilder deploymentBuilder=repositoryService.createDeployment();//创建一个部署对象
deploymentBuilder.name("helloWorld入门程序");//添加部署的名称
deploymentBuilder.addClasspathResource("processes/MyProcess.bpmn");//从classpath的资源加载,一次只能加载一个文件
deploymentBuilder.addClasspathResource("processes/MyProcess.png");//从classpath的资源加载,一次只能加载一个文件
Deployment deployment=deploymentBuilder.deploy();//完成部署
//打印我们的流程信息
System.out.println("部署Id:"+deployment.getId());
System.out.println("部署名称Name:"+deployment.getName());
}
/**部署流程定义(Zip)*/
@Test
public void deploymentProcessDefinitionZip(){
//数据库连接
ProcessEngineConfiguration config = ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration();
config.setJdbcDriver("com.mysql.jdbc.Driver");
config.setJdbcUrl("jdbc:mysql://localhost:3306/activiti-demo?useUnicode=true&characterEncoding=utf8");
config.setJdbcUsername("root");
config.setJdbcPassword("root");
/*
DB_SCHEMA_UPDATE_FALSE 不能创建表,需要表存在
DB_SCHEMA_UPDATE_TRUE 先删除表再创建表
DB_SCHEMA_UPDATE_TRUE 如表不存在自动创建表
*/
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine processEngine=config.buildProcessEngine();
//获得上传文件的输入流程
InputStream in=this.getClass().getClassLoader().getResourceAsStream("processes/processes.zip");
ZipInputStream zipInputStream=new ZipInputStream(in);
//获取仓库服务,从类路径下完成部署
RepositoryService repositoryService=processEngine.getRepositoryService();
DeploymentBuilder deploymentBuilder=repositoryService.createDeployment();//创建一个部署对象
deploymentBuilder.name("helloWorld入门程序11");//添加部署的名称
deploymentBuilder.addZipInputStream(zipInputStream);
Deployment deployment=deploymentBuilder.deploy();//完成部署
//打印我们的流程信息
System.out.println("部署Id:"+deployment.getId());
System.out.println("部署名称Name:"+deployment.getName());
}
/**查看流程定义
* id:(key):(version):(随机值)
* name:对应流程文件process节点的name属性
* key:对应流程文件process节点的id属性
* version:发布时自动生成的。如果是第一次发布的流程,version默认从1开始;
* 如果当前流程引擎中已存在相同的流程,则找到当前key对应的最高版本号,在最高版本号上加1*/
@Test
public void queryProcessDefinition() throws Exception{
//获取数据库连接
ProcessEngineConfiguration config = ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration();
config.setJdbcDriver("com.mysql.jdbc.Driver");
config.setJdbcUrl("jdbc:mysql://localhost:3306/activiti-demo?useUnicode=true&characterEncoding=utf8");
config.setJdbcUsername("root");
config.setJdbcPassword("root");
/*
DB_SCHEMA_UPDATE_FALSE 不能创建表,需要表存在
DB_SCHEMA_UPDATE_TRUE 先删除表再创建表
DB_SCHEMA_UPDATE_TRUE 如表不存在自动创建表
*/
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine processEngine=config.buildProcessEngine();
//获取仓库服务对象,使用版本的升级排列,查询列表
List<ProcessDefinition> pdList=processEngine.getRepositoryService()
.createProcessDefinitionQuery()
//添加查询条件
//.processDefinitionId(processDefinitionId)
//.processDefinitionKey(processDefinitionKey)
//.processDefinitionName(processDefinitionName)
//排序(可以按照id/key/name/version/Cagetory排序)
.orderByProcessDefinitionVersion().asc()
//.count()
//.listPage(firstResult, maxResults)
//.singleResult()
.list();//总的结果集数量
//便利集合,查看内容
for (ProcessDefinition pd:pdList) {
System.out.println("id:"+pd.getId());
System.out.println("name:"+pd.getName());
System.out.println("key:"+pd.getKey());
System.out.println("version:"+pd.getVersion());
System.out.println("resourceName:"+pd.getDiagramResourceName());
System.out.println("###########################################");
}
}
/**删除流程*/
@Test
public void deleteDeployment(){
//获取数据库连接
ProcessEngineConfiguration config = ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration();
config.setJdbcDriver("com.mysql.jdbc.Driver");
config.setJdbcUrl("jdbc:mysql://localhost:3306/activiti-demo?useUnicode=true&characterEncoding=utf8");
config.setJdbcUsername("root");
config.setJdbcPassword("root");
/*
DB_SCHEMA_UPDATE_FALSE 不能创建表,需要表存在
DB_SCHEMA_UPDATE_TRUE 先删除表再创建表
DB_SCHEMA_UPDATE_TRUE 如表不存在自动创建表
*/
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine processEngine=config.buildProcessEngine();
//删除发布信息
String deploymentId="1";
//获取仓库服务对象
RepositoryService repositoryService=processEngine.getRepositoryService();
//普通删除,如果当前规则下有正在执行的流程,则抛异常
repositoryService.deleteDeployment(deploymentId);
//级联删除,会删除和当前规则相关的所有信息,正在执行的信息,也包括历史信息
//repositoryService.deleteDeployment(deploymentId, true);
System.out.println("删除成功"+deploymentId);
}
/**删除key相同的所有不同版本的流程定义*/
@Test
public void deleteProcessDefinitionByKey(){
//获取数据库连接
ProcessEngineConfiguration config = ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration();
config.setJdbcDriver("com.mysql.jdbc.Driver");
config.setJdbcUrl("jdbc:mysql://localhost:3306/activiti-demo?useUnicode=true&characterEncoding=utf8");
config.setJdbcUsername("root");
config.setJdbcPassword("root");
/*
DB_SCHEMA_UPDATE_FALSE 不能创建表,需要表存在
DB_SCHEMA_UPDATE_TRUE 先删除表再创建表
DB_SCHEMA_UPDATE_TRUE 如表不存在自动创建表
*/
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine processEngine=config.buildProcessEngine();
//流程定义的key
String processDefinitionKey = "HelloWorld";
//先使用流程定义的key查询流程定义,查询出所有的版本
RepositoryService repositoryServic=processEngine.getRepositoryService();
ProcessDefinitionQuery query=repositoryServic.createProcessDefinitionQuery();
List<ProcessDefinition> list=query.processDefinitionKey(processDefinitionKey).list();
//遍历,获取每个流程定义的部署ID
if(list!=null&&list.size()>0){
for(ProcessDefinition pd:list){
//获取部署ID
String deploymentId = pd.getDeploymentId();
processEngine.getRepositoryService()
.deleteDeployment(deploymentId,true);//级联删除
}
}
}
/**查看最新版本的流程定义*/
@Test
public void queryAllLatestVersions(){
//获取数据库连接
ProcessEngineConfiguration config = ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration();
config.setJdbcDriver("com.mysql.jdbc.Driver");
config.setJdbcUrl("jdbc:mysql://localhost:3306/activiti-demo?useUnicode=true&characterEncoding=utf8");
config.setJdbcUsername("root");
config.setJdbcPassword("root");
/*
DB_SCHEMA_UPDATE_FALSE 不能创建表,需要表存在
DB_SCHEMA_UPDATE_TRUE 先删除表再创建表
DB_SCHEMA_UPDATE_TRUE 如表不存在自动创建表
*/
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine processEngine=config.buildProcessEngine();
RepositoryService repositoryServic=processEngine.getRepositoryService();
ProcessDefinitionQuery query=repositoryServic
.createProcessDefinitionQuery();
//先做一个升序排列
List<ProcessDefinition> list=query.
orderByProcessDefinitionVersion()
.asc() //使用版本升序排序
.list();//获取流程定义对象List集合
/**
* Map<String,ProcessDefinition>
* map集合的key:流程定义的key
* map集合的value:流程定义的对象
* map集合的特点:当map集合key值相同的情况下,后一次的值将替换前一次的值
* */
Map<String,ProcessDefinition> map=new LinkedHashMap<String,ProcessDefinition>();
if(list!=null&&list.size()>0){
for(ProcessDefinition pd:list){
map.put(pd.getKey(), pd);
}
}
List<ProcessDefinition> pdList=new ArrayList<ProcessDefinition>(map.values());
//遍历集合,查看内容
for (ProcessDefinition pd:pdList) {
System.out.println("id:"+pd.getId());
System.out.println("name:"+pd.getName());
System.out.println("key:"+pd.getKey());
System.out.println("version:"+pd.getVersion());
System.out.println("resourceName:"+pd.getDiagramResourceName());
System.out.println("###########################################");
}
}
}
2.Myprocess.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: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="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="提交申请" activiti:assignee="张三"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<userTask id="usertask2" name="审批【部门经理】" activiti:assignee="李四"></userTask>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<userTask id="usertask3" name="审批【总经理】" activiti:assignee="王五"></userTask>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
<bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="160.0" y="180.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
<omgdc:Bounds height="55.0" width="105.0" x="240.0" y="170.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
<omgdc:Bounds height="55.0" width="105.0" x="390.0" y="170.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
<omgdc:Bounds height="55.0" width="105.0" x="540.0" y="170.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="690.0" y="180.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="195.0" y="197.0"></omgdi:waypoint>
<omgdi:waypoint x="240.0" y="197.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="345.0" y="197.0"></omgdi:waypoint>
<omgdi:waypoint x="390.0" y="197.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
<omgdi:waypoint x="495.0" y="197.0"></omgdi:waypoint>
<omgdi:waypoint x="540.0" y="197.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
<omgdi:waypoint x="645.0" y="197.0"></omgdi:waypoint>
<omgdi:waypoint x="690.0" y="197.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
3.第一次写这个。写的不好。希望大家多多指教!!