Activiti是一款业务流程管理框架,对业务进行管理。
Activiti依靠23张表,存放流程数据。业务数据需要自己建表存储。
package test;
import java.util.List;
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.junit.Test;
/**
* 一个完整的流程
*/
public class TestProcess {
ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); //获取流程引擎
/**
* 流程定义和部署对象
*/
@Test
public void DeployProcess(){
Deployment deployment=processEngine.getRepositoryService() // 获取流程定义相关的Service
.createDeployment() // 创建一个部署对象
.name("HELLO WORD") // 添加部署名称
.addClasspathResource("diagrams/helloword.bpmn") // 在classPath加载文件,一次加载一个文件
.addClasspathResource("diagrams/helloword.png")
.deploy(); // 完成部署
System.out.println("部署ID:"+deployment.getId());
System.out.println("部署名称:"+deployment.getName());
}
/**
* 启动流程实例
*/
@Test
public void startProcessInstance(){
String processDefinitionKey="helloword"; //流程定义的key
ProcessInstance processInstance=processEngine.getRuntimeService() //获取与正在执行的流程实例和执行对象相关的service
.startProcessInstanceByKey(processDefinitionKey); //启动流程实例,key对应bpmn文件中的id
System.out.println("流程实例ID:"+processInstance.getId());
System.out.println("流程定义ID:"+processInstance.getProcessDefinitionId());
}
/**
* 查询个人任务
*/
@Test
public void queryPersionalTask(){
String assignee="王五";
List<Task> list=processEngine.getTaskService() //获取正在执行的任务管理相关的service
.createTaskQuery() //创建任务查询对象
.taskAssignee(assignee) //指定办理人
.list();
for(Task task:list){
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());
System.out.println("执行对象ID:"+task.getExecutionId());
System.out.println("流程定义ID:"+task.getProcessDefinitionId());
}
}
/**
* 完成任务
*/
@Test
public void completeTask(){
String taskId="1302";
processEngine.getTaskService() //获取正在执行的任务管理相关的service
.complete(taskId); //完成任务
System.out.println("完成任务:"+taskId);
}
}
package test;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
import bean.VarBean;
/**
* 流程变量
*
*/
public class ProcessVar {
ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); //获取流程引擎
/**
* 流程定义和部署对象
*/
@Test
public void DeployProcess(){
InputStream inputStreampng=this.getClass().getClassLoader().getResourceAsStream("diagrams/processVar.png");
InputStream inputStreambpmn=this.getClass().getClassLoader().getResourceAsStream("diagrams/processVar.bpmn");
Deployment deployment=processEngine.getRepositoryService() // 获取流程定义相关的Service
.createDeployment() // 创建一个部署对象
.name("流程定义—流程变量") // 添加部署名称
.addInputStream("processVar.png", inputStreampng) //使用资源文件名称与输入流加载资源
.addInputStream("processVar.bpmn", inputStreambpmn) //使用资源文件名称与输入流加载资源
.deploy(); // 完成部署
System.out.println("部署ID:"+deployment.getId());
System.out.println("部署名称:"+deployment.getName());
}
/**
* 启动流程实例
*/
@Test
public void startProcessInstance(){
String processDefinitionKey="processVar"; //流程定义的key
ProcessInstance processInstance=processEngine.getRuntimeService() //获取与正在执行的流程实例和执行对象相关的service
.startProcessInstanceByKey(processDefinitionKey); //启动流程实例,key对应bpmn文件中的id
System.out.println("流程实例ID:"+processInstance.getId());
System.out.println("流程定义ID:"+processInstance.getProcessDefinitionId());
}
/**
* 模拟设置和获取流程变量的值
*/
@Test
public void setAndgetVar(){
RuntimeService runtimeService=processEngine.getRuntimeService(); //与正在执行的流程实例和正在执行对象相关的service
TaskService taskSerice=processEngine.getTaskService(); //与正在执行的任务相关的service
//设置流程变量的值
// runtimeService.setVariable(executionId, variableName, value); //使用执行对象ID设置参数名称和值,一次设置一个值
// runtimeService.setVariables(executionId, variables); //使用执行对象ID和map设置参数名称和值
// taskSerice.setVariable(taskId, variableName, value); //使用任务ID设置参数名称和值
// taskSerice.setVariables(taskId, variables); //使用任务ID和map设置参数和名称
// runtimeService.startProcessInstanceByKey(processDefinitionKey, variables) //启动流程实例的时候用map设置参数
// taskSerice.complete(taskId, variables); //完成任务的时候使用map设置参数
// 使用javabean传递数据 x需要实现序列化
// VarBean vb=new VarBean(); //使用javabean设置流程变量
// vb.setId(1);
// vb.setName("a");
// taskSerice.setVariable(taskId, "人员信息", vb);
//获取流程变量的值
// runtimeService.getVariable(executionId, variableName) //使用执行对象ID和参数名称获取参数值
// runtimeService.getVariables(executionId) //使用执行对象ID获取封装流程变量名称和值的map
// runtimeService.getVariables(executionId, variableNames) //使用执行对象ID和放置了参数名称的集合作为参数返回对应参数的map
// taskSerice.getVariable(taskId, variableName) //使用任务ID和参数名称获取参数值
// taskSerice.getVariables(taskId) //使用任务ID获取封装流程变量名称和值的map
// taskSerice.getVariables(taskId, variableNames) //使用任务ID和放置了参数名称的集合作为参数返回对应参数的map
// VarBean vb= (VarBean) taskSerice.getVariable(taskId, "人员信息"); //javabean方式获取
}
/**
* 设置流程变量
*/
@Test
public void setVar(){
String taskId="3204";
TaskService taskSerice=processEngine.getTaskService(); //与正在执行的任务相关的service
// taskSerice.setVariableLocal(taskId, "请假天数", 3); //带local会绑定taskId
// taskSerice.setVariable(taskId, "请假日期", new Date());
// taskSerice.setVariable(taskId, "请假原因", "回家探亲");
// System.out.println("设置流程变量OK");
VarBean vb=new VarBean(); //使用javabean设置流程变量
vb.setId(1);
vb.setName("a");
taskSerice.setVariable(taskId, "人员信息", vb);
System.out.println("设置流程变量OK");
}
/**
* 获取流程变量
*/
@Test
public void getVar(){
String taskId="3204";
TaskService taskSerice=processEngine.getTaskService(); //与正在执行的任务相关的service
// Integer day= (Integer) taskSerice.getVariable(taskId, "请假天数");
// Date d= (Date) taskSerice.getVariable(taskId, "请假日期");
// String c= (String) taskSerice.getVariable(taskId, "请假原因");
// System.out.println(day+","+d+","+c);
VarBean vb= (VarBean) taskSerice.getVariable(taskId, "人员信息");
System.out.println(vb.getId()+","+vb.getName());
}
/**
* 完成任务
*/
@Test
public void completeTask(){
String taskId="3402";
processEngine.getTaskService() //获取正在执行的任务管理相关的service
.complete(taskId); //完成任务
System.out.println("完成任务:"+taskId);
}
/**
* 查询流程变量的历史表
*/
@Test
public void queryProcessVarHis(){
List<HistoricVariableInstance> list= processEngine.getHistoryService()
.createHistoricVariableInstanceQuery() //创建历史流程变量查询对象
.variableName("请假天数")
.list();
for(HistoricVariableInstance hvi:list){
System.out.println(hvi.getId()+","+hvi.getProcessInstanceId()+","+hvi.getVariableName()+","
+hvi.getVariableTypeName()+","+hvi.getValue());
}
}
}
package test;
import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
/**
* 流程实例和执行对象
*
*/
public class ProcessInstanceAndExe {
ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
/**
* 使用zip方式部署对象和流程定义
*/
@Test
public void DeployProcessByzip(){
InputStream in=this.getClass().getClassLoader().getResourceAsStream("diagrams/helloword.zip");
ZipInputStream zis=new ZipInputStream(in);
System.out.println(11112);
Deployment deployment=processEngine.getRepositoryService() // 获取流程定义相关的Service
.createDeployment() // 创建一个部署对象
.name("流程定义和部署对象") // 添加部署名称
// .addClasspathResource("diagrams/helloword.bpmn") // 在classPath加载文件,一次加载一个文件
// .addClasspathResource("diagrams/helloword.png")
.addZipInputStream(zis)
.deploy(); // 完成部署
System.out.println("部署ID:"+deployment.getId());
System.out.println("部署名称:"+deployment.getName());
}
/**
* 启动流程实例
*/
@Test
public void startProcessInstance(){
String processDefinitionKey="helloword"; //流程定义的key
ProcessInstance processInstance=processEngine.getRuntimeService() //获取与正在执行的流程实例和执行对象相关的service
.startProcessInstanceByKey(processDefinitionKey); //启动流程实例,key对应bpmn文件中的id
System.out.println("流程实例ID:"+processInstance.getId());
System.out.println("流程定义ID:"+processInstance.getProcessDefinitionId());
}
/**
* 查询个人任务
*/
@Test
public void queryPersionalTask(){
String assignee="王五";
List<Task> list=processEngine.getTaskService() //获取正在执行的任务管理相关的service
.createTaskQuery() //创建任务查询对象
//条件查询
.taskAssignee(assignee) //指定办理人
// .processDefinitionId(processDefinitionId) //使用流程定义id查询
// .processInstanceId(processInstanceId) //流程实例ID查询
// .executionId(executionId) //执行对象ID查询
// .taskCandidateUser(candidateUser) //组任务的办理人查询
//排序
// .orderByTaskCreateTime().asc() //按创建时间升序排列
//返回结果
// .singleResult() //返回单个对象
// .count() //返回结果数量
// .listPage(firstResult, maxResults) //分页查询
.list(); //返回列表
for(Task task:list){
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());
System.out.println("执行对象ID:"+task.getExecutionId());
System.out.println("流程定义ID:"+task.getProcessDefinitionId());
}
}
/**
* 完成任务
*/
@Test
public void completeTask(){
String taskId="2302";
processEngine.getTaskService() //获取正在执行的任务管理相关的service
.complete(taskId); //完成任务
System.out.println("完成任务:"+taskId);
}
/**
* 查询流程状态,判断流程是否执行完毕
*/
@Test
public void isProcessEnd(){
String processInstanceId="2101";
ProcessInstance pi= processEngine.getRuntimeService()
.createProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
if(pi==null){
System.out.println("执行完毕");
}else{
System.out.println("未执行完");
}
}
/**
* 查询历史任务表
*/
@Test
public void queryHistoryTaskInst(){
String taskAssignee="张三";
List<HistoricTaskInstance> list=processEngine.getHistoryService() //与历史数据相关的service
.createHistoricTaskInstanceQuery() //创建历史任务的查询
.taskAssignee(taskAssignee) //使用办理人查询
.list();
for(HistoricTaskInstance hti:list){
System.out.println(hti.getId()+","+hti.getName()+","+hti.getProcessInstanceId()+","+hti.getStartTime()+hti.getDurationInMillis());
}
}
/**
* 查询历史流程实例表
*/
@Test
public void queryHistoryProcessInstance(){
String processInstanceId="1601";
HistoricProcessInstance hpi=processEngine.getHistoryService() //与历史数据相关的service
.createHistoricProcessInstanceQuery() //创建历史流程实例查询
.processInstanceId(processInstanceId) //使用流程实例id作为查询条件
.singleResult();
System.out.println(hpi.getId()+","+hpi.getProcessDefinitionId()+","+hpi.getStartTime()+","+hpi.getEndTime()+","+hpi.getDurationInMillis());
}
}
package test;
import java.io.File;
import java.io.IOException;
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.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
/**
* 流程定义
*
*/
public class ProcessDef {
ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); //获取流程引擎
/**
* 流程定义和部署对象
*/
@Test
public void DeployProcess(){
Deployment deployment=processEngine.getRepositoryService() // 获取流程定义相关的Service
.createDeployment() // 创建一个部署对象
.name("流程定义和部署对象") // 添加部署名称
.addClasspathResource("diagrams/helloword.bpmn") // 在classPath加载文件,一次加载一个文件
.addClasspathResource("diagrams/helloword.png")
.deploy(); // 完成部署
System.out.println("部署ID:"+deployment.getId());
System.out.println("部署名称:"+deployment.getName());
}
/**
* 使用zip方式部署对象和流程定义
*/
@Test
public void DeployProcessByzip(){
InputStream in=this.getClass().getClassLoader().getResourceAsStream("diagrams/helloword.zip");
ZipInputStream zis=new ZipInputStream(in);
System.out.println(11112);
Deployment deployment=processEngine.getRepositoryService() // 获取流程定义相关的Service
.createDeployment() // 创建一个部署对象
.name("流程定义和部署对象") // 添加部署名称
// .addClasspathResource("diagrams/helloword.bpmn") // 在classPath加载文件,一次加载一个文件
// .addClasspathResource("diagrams/helloword.png")
.addZipInputStream(zis)
.deploy(); // 完成部署
System.out.println("部署ID:"+deployment.getId());
System.out.println("部署名称:"+deployment.getName());
}
/**
* 流程定义查询
*/
@Test
public void findProcessDefinition(){
List<ProcessDefinition> list=processEngine.getRepositoryService()
.createProcessDefinitionQuery()
//条件查询
// .deploymentId("") //部署对象的ID查询
// .processDefinitionId("") //使用流程定义ID查询
// .processDefinitionKey("") //使用流程定义的key查询
// .processDefinitionNameLike("") //使用流程定义的名称模糊查询
// //排序
// .orderByProcessDefinitionVersion().asc() //使用流程定义 的版本升序排列
// .orderByProcessDefinitionName().desc() //使用流程定义的名称降序排列
//返回结果
.list() //返回一个集合列表,封装流程定义
// .singleResult() //返回唯一结果集
// .count() //返回结果集数量
// .listPage(firstResult, maxResults) //分页查询
;
for(ProcessDefinition pf:list){
System.out.println("流程定义ID:"+pf.getId());
System.out.println("流程定义的名称:"+pf.getName()); //对应bpmn文件的name
System.out.println("流程定义的key:"+pf.getKey()); //对应bpmn文件中的id
System.out.println("流程定义的版本:"+pf.getVersion()); //当key相同 版本从1升级
System.out.println("资源名称pmn文件:"+pf.getResourceName());
System.out.println("资源名称ong文件:"+pf.getDiagramResourceName());
System.out.println("部署对象ID:"+pf.getDeploymentId());
}
}
/**
* 删除流程定义
*/
@Test
public void delProcessDefinition(){
//不带级联的删除,流程启动后无法删除
// String deploymentId="606";
// processEngine.getRepositoryService()
// .deleteDeployment(deploymentId); //使用部署ID完成删除 //不带级联的删除
//级联的删除,流程是否启动都能删除成功
String deploymentId="5401";
processEngine.getRepositoryService()
.deleteDeployment(deploymentId,true); //使用部署ID完成删除 //不带级联的删除
System.out.println("删除成功");
}
/**
* 查看流程图片
*/
@Test
public void viewPic(){
String deploymentId="1001";
String resourceName=""; //图片名称
//将生成图片放在文件夹下
List<String> list=processEngine.getRepositoryService()
.getDeploymentResourceNames(deploymentId);//获取资源名称 bpmn和png
for(String s:list){
if(s.indexOf(".png")>-1){
resourceName=s;
}
}
//获取图片的输入流
InputStream is=processEngine.getRepositoryService()
.getResourceAsStream(deploymentId, resourceName);
//将图片生成到F盘下
File f=new File("F:/"+resourceName);
System.out.println("F:/"+resourceName);
try {
FileUtils.copyInputStreamToFile(is, f); //将输入流的图片写到file中
System.out.println("复制成功");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 查询最新版本流程定义
*/
@Test
public void findLastVersionProcessDefinition(){
List<ProcessDefinition> list=processEngine.getRepositoryService()
.createProcessDefinitionQuery()
.orderByProcessDefinitionVersion()
.asc() //按照流程定义的版本对流程定义列表升序排列
.list();
Map<String, ProcessDefinition> map=new LinkedHashMap();
for(ProcessDefinition pd:list){
map.put(pd.getKey(), pd); //key相同,后面的流程定义对象覆盖前面的,版本最新的在list的后面
}
List<ProcessDefinition> l=new ArrayList(map.values()); //把map中的全部值,放在list
for(ProcessDefinition pf:l){
System.out.println("流程定义ID:"+pf.getId());
System.out.println("流程定义的名称:"+pf.getName()); //对应bpmn文件的name
System.out.println("流程定义的key:"+pf.getKey()); //对应bpmn文件中的id
System.out.println("流程定义的版本:"+pf.getVersion()); //当key相同 版本从1升级
System.out.println("资源名称pmn文件:"+pf.getResourceName());
System.out.println("资源名称ong文件:"+pf.getDiagramResourceName());
System.out.println("部署对象ID:"+pf.getDeploymentId());
}
}
/**
* 使用流程定义的key删除(删除key相同的所有不同的流程定义)
*/
@Test
public void delProcessDefinitionBykey(){
String processDefinitionKey="helloword";
List<ProcessDefinition> list=processEngine.getRepositoryService()
.createProcessDefinitionQuery()
.processDefinitionKey(processDefinitionKey)
.list();
String deploymentId="";
for(ProcessDefinition pd:list){
deploymentId=pd.getDeploymentId();
processEngine.getRepositoryService()
.deleteDeployment(deploymentId,true);
}
System.out.println("del ok");
}
}
package test;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricVariableInstance;
import org.junit.Test;
/**
* 历史表相关的查询
*
*/
public class HisroryQuery {
ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine(); //获取流程引擎
/**
* 查询历史流程实例表
*/
@Test
public void queryHistoryProcessInstance(){
String processInstanceId="3201";
HistoricProcessInstance hpi=processEngine.getHistoryService() //与历史数据相关的service
.createHistoricProcessInstanceQuery() //创建历史流程实例查询
.processInstanceId(processInstanceId) //使用流程实例id作为查询条件
.singleResult();
System.out.println(hpi.getId()+","+hpi.getProcessDefinitionId()+","+hpi.getStartTime()+","+hpi.getEndTime()+","+hpi.getDurationInMillis());
}
/**
* 查询历史活动表
*/
@Test
public void queryHistoryAct(){
String processInstanceId="3201";
List<HistoricActivityInstance> list= processEngine.getHistoryService()
.createHistoricActivityInstanceQuery() //创建历史活动的查询对象
.orderByHistoricActivityInstanceStartTime().asc()
.processInstanceId(processInstanceId)
.list();
if(list!=null&&list.size()>0){
for(HistoricActivityInstance hai:list){
System.out.println(hai.getActivityId()+","+hai.getProcessDefinitionId()+","+
hai.getActivityType()+","+hai.getStartTime()+","+hai.getTaskId()+","+hai.getProcessInstanceId());
}
}
}
/**
* 查询历史任务表
*/
@Test
public void queryHistoryTaskInst(){
String processInstanceId="3201";
List<HistoricTaskInstance> list=processEngine.getHistoryService() //与历史数据相关的service
.createHistoricTaskInstanceQuery() //创建历史任务的查询
.processInstanceId(processInstanceId) //使用流程实例ID查询
.list();
for(HistoricTaskInstance hti:list){
System.out.println(hti.getId()+","+hti.getName()+","+hti.getProcessInstanceId()+","+hti.getStartTime()+hti.getDurationInMillis());
}
}
/**
* 查询流程变量的历史表
*/
@Test
public void queryProcessVarHis(){
String processInstanceId="3201";
List<HistoricVariableInstance> list= processEngine.getHistoryService()
.createHistoricVariableInstanceQuery() //创建历史流程变量查询对象
.processInstanceId(processInstanceId)
.list();
for(HistoricVariableInstance hvi:list){
System.out.println(hvi.getId()+","+hvi.getProcessInstanceId()+","+hvi.getVariableName()+","
+hvi.getVariableTypeName()+","+hvi.getValue());
}
}
}