[关闭]
@ruoli 2016-08-19T14:08:57.000000Z 字数 16024 阅读 2526

Activiti基础操作

Activiti


一、数据库创建与部署

1、数据库创建

以下两种方式可以创建Activiti数据库,初始化必须表结构,示例代码如下:

  1. package activiti.Act_1_数据库创建与部署;
  2. import org.activiti.engine.ProcessEngine;
  3. import org.activiti.engine.ProcessEngineConfiguration;
  4. import org.junit.Test;
  5. public class Act_1_创建表结构 {
  6. /**
  7. * 方式一:依赖配置文件
  8. */
  9. @Test
  10. public void createTable() {
  11. ProcessEngine processEngine = ProcessEngineConfiguration
  12. .createProcessEngineConfigurationFromResource(
  13. "activiti.cfg.xml")
  14. .buildProcessEngine();
  15. System.out.println("processEngine:" + processEngine);
  16. }
  17. /**
  18. * 方式二:不依赖配置文件
  19. */
  20. @Test
  21. public void createTable2(){
  22. ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
  23. //连接数据库的配置
  24. processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
  25. processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8");
  26. processEngineConfiguration.setJdbcUsername("root");
  27. processEngineConfiguration.setJdbcPassword("root");
  28. /**
  29. public static final String DB_SCHEMA_UPDATE_FALSE = "false";//不能自动创建表,需要表存在
  30. public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";//先删除表再创建表
  31. public static final String DB_SCHEMA_UPDATE_TRUE = "true";//如果表不存在,自动创建表
  32. */
  33. processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
  34. //工作流的核心对象,ProcessEnginee对象
  35. ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
  36. System.out.println("processEngine:"+processEngine);
  37. }
  38. }

依赖配置文件如下:

  1. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 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
  2. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
  3. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
  4. <bean class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration" id="processEngineConfiguration">
  5. <!-- 连接数据的配置 -->
  6. <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
  7. <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti_wfe?useUnicode=true&characterEncoding=utf8"></property>
  8. <property name="jdbcUsername" value="root"></property>
  9. <property name="jdbcPassword" value="root"></property>
  10. <!-- 没有表创建表 -->
  11. <property name="databaseSchemaUpdate" value="true"></property>
  12. </bean>
  13. </beans>

2、部署流程图

画好流程图后,可以使用以下两种方式部署流程定义,代码如下:

  1. package activiti.Act_1_数据库创建与部署;
  2. import java.io.InputStream;
  3. import java.util.zip.ZipInputStream;
  4. import org.activiti.engine.ProcessEngine;
  5. import org.activiti.engine.ProcessEngines;
  6. import org.activiti.engine.repository.Deployment;
  7. import org.junit.Test;
  8. public class Act_2_部署流程定义 {
  9. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  10. /**
  11. * 方式一:
  12. * 部署流程定义*/
  13. @Test
  14. public void deploymentProcessDefinition(){
  15. Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
  16. .createDeployment()//创建一个部署对象
  17. .name("测试部署名称")//添加部署的名称
  18. .addClasspathResource("diagrams/TestAct.bpmn")//从classpath的资源中加载,一次只能加载一个文件
  19. .addClasspathResource("diagrams/TestAct.png")//从classpath的资源中加载,一次只能加载一个文件
  20. .deploy();//完成部署
  21. System.out.println("部署ID:"+deployment.getId());//1
  22. System.out.println("部署名称:"+deployment.getName());//helloworld入门程序
  23. }
  24. /**
  25. * 方式二:
  26. * 部署流程定义(从zip)*/
  27. @Test
  28. public void deploymentProcessDefinition_zip(){
  29. InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
  30. ZipInputStream zipInputStream = new ZipInputStream(in);
  31. Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
  32. .createDeployment()//创建一个部署对象
  33. .name("流程定义")//添加部署的名称
  34. .addZipInputStream(zipInputStream)//指定zip格式的文件完成部署
  35. .deploy();//完成部署
  36. System.out.println("部署ID:"+deployment.getId());//
  37. System.out.println("部署名称:"+deployment.getName());//
  38. }
  39. }

二、流程定义操作

1、查询流程定义

  1. package activiti.Act_2_流程定义操作;
  2. import java.util.ArrayList;
  3. import java.util.LinkedHashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import org.activiti.engine.ProcessEngine;
  7. import org.activiti.engine.ProcessEngines;
  8. import org.activiti.engine.repository.ProcessDefinition;
  9. import org.junit.Test;
  10. public class Act_1_查询流程定义 {
  11. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  12. /**
  13. * 查询流程定义
  14. */
  15. @Test
  16. public void findProcessDefinition(){
  17. List<ProcessDefinition> list = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
  18. .createProcessDefinitionQuery()//创建一个流程定义的查询
  19. /**指定查询条件,where条件*/
  20. // .deploymentId(deploymentId)//使用部署对象ID查询
  21. // .processDefinitionId(processDefinitionId)//使用流程定义ID查询
  22. // .processDefinitionKey(processDefinitionKey)//使用流程定义的key查询
  23. // .processDefinitionNameLike(processDefinitionNameLike)//使用流程定义的名称模糊查询
  24. /**排序*/
  25. .orderByProcessDefinitionVersion().asc()//按照版本的升序排列
  26. // .orderByProcessDefinitionName().desc()//按照流程定义的名称降序排列
  27. /**返回的结果集*/
  28. .list();//返回一个集合列表,封装流程定义
  29. // .singleResult();//返回惟一结果集
  30. // .count();//返回结果集数量
  31. // .listPage(firstResult, maxResults);//分页查询
  32. if(list!=null && list.size()>0){
  33. for(ProcessDefinition pd:list){
  34. System.out.println("流程定义ID:"+pd.getId());//流程定义的key+版本+随机生成数
  35. System.out.println("流程定义的名称:"+pd.getName());//对应helloworld.bpmn文件中的name属性值
  36. System.out.println("流程定义的key:"+pd.getKey());//对应helloworld.bpmn文件中的id属性值
  37. System.out.println("流程定义的版本:"+pd.getVersion());//当流程定义的key值相同的相同下,版本升级,默认1
  38. System.out.println("资源名称bpmn文件:"+pd.getResourceName());
  39. System.out.println("资源名称png文件:"+pd.getDiagramResourceName());
  40. System.out.println("部署对象ID:"+pd.getDeploymentId());
  41. System.out.println("###################");
  42. }
  43. }
  44. }
  45. /**
  46. *
  47. * 查询最新版本的流程定义
  48. *
  49. * */
  50. @Test
  51. public void findLastVersionProcessDefinition(){
  52. List<ProcessDefinition> list = processEngine.getRepositoryService()//
  53. .createProcessDefinitionQuery()//
  54. .orderByProcessDefinitionVersion().asc()//使用流程定义的版本升序排列
  55. .list();
  56. /**
  57. * Map<String,ProcessDefinition>
  58. map集合的key:流程定义的key
  59. map集合的value:流程定义的对象
  60. map集合的特点:当map集合key值相同的情况下,后一次的值将替换前一次的值
  61. */
  62. Map<String, ProcessDefinition> map = new LinkedHashMap<String, ProcessDefinition>();
  63. if(list!=null && list.size()>0){
  64. for(ProcessDefinition pd:list){
  65. map.put(pd.getKey(), pd);
  66. }
  67. }
  68. List<ProcessDefinition> pdList = new ArrayList<ProcessDefinition>(map.values());
  69. if(pdList!=null && pdList.size()>0){
  70. for(ProcessDefinition pd:pdList){
  71. System.out.println("流程定义ID:"+pd.getId());//流程定义的key+版本+随机生成数
  72. System.out.println("流程定义的名称:"+pd.getName());//对应helloworld.bpmn文件中的name属性值
  73. System.out.println("流程定义的key:"+pd.getKey());//对应helloworld.bpmn文件中的id属性值
  74. System.out.println("流程定义的版本:"+pd.getVersion());//当流程定义的key值相同的相同下,版本升级,默认1
  75. System.out.println("资源名称bpmn文件:"+pd.getResourceName());
  76. System.out.println("资源名称png文件:"+pd.getDiagramResourceName());
  77. System.out.println("部署对象ID:"+pd.getDeploymentId());
  78. System.out.println("#########################################################");
  79. }
  80. }
  81. }
  82. }

2、删除询流程定义

  1. package activiti.Act_2_流程定义操作;
  2. import java.util.List;
  3. import org.activiti.engine.ProcessEngine;
  4. import org.activiti.engine.ProcessEngines;
  5. import org.activiti.engine.repository.ProcessDefinition;
  6. import org.junit.Test;
  7. public class Act_2_删除流程定义 {
  8. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  9. /**删除流程定义*/
  10. @Test
  11. public void deleteProcessDefinition(){
  12. //使用部署ID,完成删除
  13. String deploymentId = "1";
  14. /**
  15. * 不带级联的删除
  16. * 只能删除没有启动的流程,如果流程启动,就会抛出异常
  17. */
  18. // processEngine.getRepositoryService()//
  19. // .deleteDeployment(deploymentId);
  20. /**
  21. * 级联删除,删除流程部署信息,流程定义信息,正在执行和历史关联的流程环节
  22. * 不管流程是否启动,都能可以删除
  23. */
  24. processEngine.getRepositoryService()//
  25. .deleteDeployment(deploymentId, true);
  26. System.out.println("删除成功!");
  27. }
  28. /**
  29. * 删除流程定义(删除key相同的所有不同版本的流程定义)
  30. * */
  31. @Test
  32. public void deleteProcessDefinitionByKey(){
  33. //流程定义的key
  34. String processDefinitionKey = "testAct";
  35. //先使用流程定义的key查询流程定义,查询出所有的版本
  36. List<ProcessDefinition> list = processEngine.getRepositoryService()//
  37. .createProcessDefinitionQuery()//
  38. .processDefinitionKey(processDefinitionKey)//使用流程定义的key查询
  39. .list();
  40. //遍历,获取每个流程定义的部署ID
  41. if(list!=null && list.size()>0){
  42. for(ProcessDefinition pd:list){
  43. //获取部署ID
  44. String deploymentId = pd.getDeploymentId();
  45. processEngine.getRepositoryService()//
  46. .deleteDeployment(deploymentId, true);
  47. }
  48. }
  49. }
  50. }

3、查看流程图

  1. package activiti.Act_2_流程定义操作;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.util.List;
  6. import org.activiti.engine.ProcessEngine;
  7. import org.activiti.engine.ProcessEngines;
  8. import org.apache.commons.io.FileUtils;
  9. import org.junit.Test;
  10. public class Act_3_查看流程图 {
  11. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  12. /**查看流程图
  13. * @throws IOException */
  14. @Test
  15. public void viewPic() throws IOException{
  16. /**将生成图片放到文件夹下*/
  17. String deploymentId = "301";
  18. //获取图片资源名称
  19. List<String> list = processEngine.getRepositoryService()//
  20. .getDeploymentResourceNames(deploymentId);
  21. //定义图片资源的名称
  22. String resourceName = "";
  23. if(list!=null && list.size()>0){
  24. for(String name:list){
  25. if(name.indexOf(".png")>=0){
  26. resourceName = name;
  27. }
  28. }
  29. }
  30. //获取图片的输入流
  31. InputStream in = processEngine.getRepositoryService()//
  32. .getResourceAsStream(deploymentId, resourceName);
  33. //将图片生成到D盘的目录下
  34. File file = new File("D:/"+resourceName);
  35. //将输入流的图片写到D盘下
  36. FileUtils.copyInputStreamToFile(in, file);
  37. }
  38. }

三、流程扭转操作

1、启动流程实例

  1. package activiti.Act_3_流程扭转操作;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import org.activiti.engine.ProcessEngine;
  7. import org.activiti.engine.ProcessEngines;
  8. import org.activiti.engine.runtime.ProcessInstance;
  9. import org.junit.Test;
  10. public class Act_1_启动流程实例 {
  11. /**启动流程实例*/
  12. @Test
  13. public void startProcessInstance(){
  14. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  15. //流程定义的key
  16. String processDefinitionKey = "processTest";
  17. List<String> users=new ArrayList<String>();
  18. users.add("a1");
  19. users.add("b1");
  20. Map<String,Object> parameter=new HashMap<String, Object>();
  21. parameter.put("users", users);
  22. ProcessInstance pi = processEngine.getRuntimeService()
  23. //与正在执行的流程实例和执行对象相关的Service
  24. .startProcessInstanceByKey(processDefinitionKey,parameter);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
  25. System.out.println("流程实例ID:"+pi.getId());//流程实例ID 101
  26. System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID helloworld:1:4
  27. }
  28. }

2、查询个人任务

  1. package activiti.Act_3_流程扭转操作;
  2. import java.util.List;
  3. import org.activiti.engine.ProcessEngine;
  4. import org.activiti.engine.ProcessEngines;
  5. import org.activiti.engine.task.Task;
  6. import org.junit.Test;
  7. public class Act_2_查询个人任务 {
  8. /**查询当前人的个人任务*/
  9. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  10. @Test
  11. public void findMyPersonalTask(){
  12. String assignee = "admin";
  13. List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
  14. .createTaskQuery()//创建任务查询对象
  15. .taskAssignee(assignee).active()//指定个人任务查询,指定办理人,此为私有任务
  16. .includeTaskLocalVariables()
  17. .includeProcessVariables()
  18. .list();
  19. if(list!=null && list.size()>0){
  20. for(Task task:list){
  21. System.out.println("任务ID:"+task.getId());
  22. System.out.println("任务名称:"+task.getName());
  23. System.out.println("任务的创建时间:"+task.getCreateTime());
  24. System.out.println("任务的办理人:"+task.getAssignee());
  25. System.out.println("流程实例ID:"+task.getProcessInstanceId());
  26. System.out.println("执行对象ID:"+task.getExecutionId());
  27. System.out.println("流程定义ID:"+task.getProcessDefinitionId());
  28. System.out.println("Task中获取参数:"+task.getProcessVariables());
  29. System.out.println("Task中获取Local参数:"+task.getTaskLocalVariables());
  30. System.out.println("getTaskService中获取参数:"+processEngine.getTaskService().getVariables(task.getId()));
  31. System.out.println("流程处理人:"+task.getAssignee());
  32. System.out.println("########################################################");
  33. }
  34. }
  35. }
  36. }

3、查询流程实例状态

  1. package activiti.Act_3_流程扭转操作;
  2. import org.activiti.engine.ProcessEngine;
  3. import org.activiti.engine.ProcessEngines;
  4. import org.activiti.engine.runtime.ProcessInstance;
  5. import org.junit.Test;
  6. /**
  7. * 一个流程中,执行对象可以存在多个,但是流程实例只能有一个,一个执行对象可以对应多个任务
  8. * @author Administrator
  9. *
  10. */
  11. public class Act_4_查询流程实例状态 {
  12. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  13. /**
  14. * 查询流程状态(判断流程正在执行,还是结束)
  15. * */
  16. @Test
  17. public void isProcessEnd(){
  18. String processInstanceId = "2801";
  19. ProcessInstance pi = processEngine.getRuntimeService()//表示正在执行的流程实例和执行对象
  20. .createProcessInstanceQuery()//创建流程实例查询
  21. .processInstanceId(processInstanceId)//使用流程实例ID查询
  22. .singleResult();
  23. if(pi==null){
  24. System.out.println("流程已经结束");
  25. }
  26. else{
  27. System.out.println("流程正在执行");
  28. }
  29. }
  30. }

4、删除所有流程数据

  1. package activiti.Act_3_流程扭转操作;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import java.util.List;
  5. import org.activiti.engine.ProcessEngine;
  6. import org.activiti.engine.ProcessEngines;
  7. import org.activiti.engine.history.HistoricProcessInstance;
  8. import org.activiti.engine.runtime.ProcessInstance;
  9. import org.junit.Test;
  10. public class Act_7_删除所有流程数据 {
  11. @Test
  12. public void removeIns(){
  13. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  14. // //删除正在运行的流程
  15. List<ProcessInstance> instanceList=processEngine.getRuntimeService()
  16. .createProcessInstanceQuery().list();
  17. System.out.println("开始删除正在运行的流程数据");
  18. for (ProcessInstance processInstance : instanceList) {
  19. processEngine.getRuntimeService().deleteProcessInstance(processInstance.getProcessInstanceId(), "");
  20. processEngine.getHistoryService().deleteHistoricProcessInstance(processInstance.getProcessInstanceId());
  21. System.out.println("已删除:"+instanceList.indexOf(processInstance)+"/"+instanceList.size());
  22. }
  23. System.out.println("正在运行的流程删除完毕");
  24. //删除历史流程
  25. try{
  26. System.out.println("开始删除历史流程数据");
  27. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" );
  28. Date date = sdf.parse("2016-07-01 23:20:00");//删除指定日期之前的历史数据
  29. List<HistoricProcessInstance> list=processEngine.getHistoryService().createHistoricProcessInstanceQuery()
  30. .startedBefore(date).list();
  31. for (HistoricProcessInstance processInstance : list){
  32. System.out.println(list.indexOf(processInstance));
  33. processEngine.getHistoryService().deleteHistoricProcessInstance(processInstance.getId());
  34. System.out.println("已删除:"+list.indexOf(processInstance)+"/"+list.size());
  35. }
  36. System.out.println("历史流程删除完毕");
  37. }catch (Exception e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }

四、历史数据操作

1、查询历史流程实例

  1. package activiti.Act_4_历史数据操作;
  2. import org.activiti.engine.ProcessEngine;
  3. import org.activiti.engine.ProcessEngines;
  4. import org.activiti.engine.history.HistoricProcessInstance;
  5. import org.junit.Test;
  6. public class Act_1_查询历史流程实例 {
  7. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  8. /**查询历史流程实例(后面讲)*/
  9. @Test
  10. public void findHistoryProcessInstance(){
  11. String processInstanceId = "401";
  12. HistoricProcessInstance hpi = processEngine.getHistoryService()//与历史数据(历史表)相关的Service
  13. .createHistoricProcessInstanceQuery()//创建历史流程实例查询
  14. .processInstanceId(processInstanceId)//使用流程实例ID查询
  15. .singleResult();
  16. System.out.println("流程实例ID:"+hpi.getId()+"\n流程定义ID:"+hpi.getProcessDefinitionId()+"\n流程开始时间:"+hpi.getStartTime()+"\n流程结束时间:"+hpi.getEndTime()+"\n流程持续毫秒数:"+hpi.getDurationInMillis());
  17. }
  18. }

2、查询个人历史任务

  1. package activiti.Act_4_历史数据操作;
  2. import java.util.List;
  3. import org.activiti.engine.ProcessEngine;
  4. import org.activiti.engine.ProcessEngines;
  5. import org.activiti.engine.history.HistoricTaskInstance;
  6. import org.junit.Test;
  7. public class Act_2_查询个人历史任务 {
  8. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  9. /**查询历史任务(后面讲)*/
  10. @Test
  11. public void findHistoryTask(){
  12. String taskAssignee = "张三";
  13. List<HistoricTaskInstance> list = processEngine.getHistoryService()//与历史数据(历史表)相关的Service
  14. .createHistoricTaskInstanceQuery()//创建历史任务实例查询
  15. .taskAssignee(taskAssignee)//指定历史任务的办理人
  16. .list();
  17. if(list!=null && list.size()>0){
  18. for(HistoricTaskInstance hti:list){
  19. System.out.println("TaskID:"+hti.getId()+"\nTask名称:"+hti.getName()+"\n流程实例ID:"+hti.getProcessInstanceId()+"\n任务开始时间:"+hti.getStartTime()+"\n任务结束时间:"+hti.getEndTime()+"\n持续时间毫秒数:"+hti.getDurationInMillis());
  20. System.out.println("################################");
  21. }
  22. }
  23. }
  24. }

3、查询历史流程变量

  1. package activiti.Act_4_历史数据操作;
  2. import java.util.List;
  3. import org.activiti.engine.ProcessEngine;
  4. import org.activiti.engine.ProcessEngines;
  5. import org.activiti.engine.history.HistoricVariableInstance;
  6. import org.junit.Test;
  7. public class Act_5_查询历史流程变量 {
  8. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  9. /**查询历史流程变量*/
  10. @Test
  11. public void findHistoryProcessVariables(){
  12. String processInstanceId = "2101";
  13. List<HistoricVariableInstance> list = processEngine.getHistoryService()
  14. .createHistoricVariableInstanceQuery()
  15. .processInstanceId(processInstanceId)
  16. .list();
  17. if(list!=null && list.size()>0){
  18. for(HistoricVariableInstance hvi:list){
  19. System.out.println(hvi.getId()+" "+hvi.getProcessInstanceId()+" "+hvi.getVariableName()+" "+hvi.getVariableTypeName()+" "+hvi.getValue());
  20. System.out.println("###############################################");
  21. }
  22. }
  23. }
  24. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注