工作流框架Activiti常用功能初探

来源:互联网 发布:linux 下的awk gensub 编辑:程序博客网 时间:2024/05/18 03:08

Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实现。

BPMN是由BPMI(The Business Process Management Initiative)开发了一套标准叫业务流程建模符号(BPMN - Business Process Modeling Notation)BPMN定义了一个业务流程图(Business Process Diagram),该业务流程图基于一个流程图(flowcharting),该流程图被设计用于创建业务流程操作的图形化模型。而一个业务流程模型(Business Process Model),指一个由的图形对象(graphical objects)组成的网状图,图形对象包括活动(acticities)和用于定义这些活动执行顺序的流程控制器(flow controls)。

以下是对Activiti框架几个常用功能的测试。

环境:MySQL,eclipse,jdk1.7,activiti5.13

首先将Activiti相关的JAR包导入到项目中,由于JAR众多,这里就不列举了。主要记录代码部分。

1.在eclipse中安装Activiti插件

Help -> InstallNew Software,在如下Install界面板中,点击Add按钮

然后在Name和Location中分别填入如下内容:

Name: Activiti BPMN 2.0 designer

Location: http://activiti.org/designer/update/

然后一直下一步、下一步安装,根据提示重启eclipse


重启后,再打开菜单Windows->Preferences->Activiti->Save下流程流程图片的生成方式



2.配置log4j,让其打印出sql语句

在项目根目录下创建log4j.properties文件,在此文件中输入以下配置信息
[html] view plain copy
  1. ### direct log messages to stdout ###  
  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  3. log4j.appender.stdout.Target=System.err  
  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  5. log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  
  6.   
  7. ### direct messages to file mylog.log ###  
  8. log4j.appender.file=org.apache.log4j.FileAppender  
  9. log4j.appender.file.File=c:\mylog.log  
  10. log4j.appender.file.layout=org.apache.log4j.PatternLayout  
  11. log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  
  12.   
  13. ### set log levels - for more verbose logging change 'info' to 'debug' ###  
  14.   
  15. log4j.rootLogger=debug, stdout  

3.activiti-context.xml配置activiti

在项目根目录创建activiti-context.xml文件,在其中配置如下内容
其中的activitiStudy为数据库名,须自己提前创建好。
[html] view plain copy
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.     xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  5.                         http://www.springframework.org/schema/beans/spring-beans.xsd  
  6.                         http://www.springframework.org/schema/context   
  7.                         http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  8.                         http://www.springframework.org/schema/tx   
  9.                         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  10.     <!-- 配置流程引擎配置对象 -->  
  11.     <bean id="processEngineConfiguration"  
  12.         class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">  
  13.         <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />  
  14.         <property name="jdbcUrl" value="jdbc:mysql:///activitiStudy?useUnicode=true&characterEncoding=UTF-8"/>  
  15.         <property name="jdbcUsername" value="root" />  
  16.         <property name="jdbcPassword" value="root" />  
  17.         <property name="databaseSchemaUpdate" value="true" />  
  18.     </bean>  
  19.   
  20.     <!-- 配置一个流程引擎工厂bean,用于创建流程引擎对象 -->  
  21.     <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">  
  22.         <!-- 通过set方法注入流程引擎配置对象 -->  
  23.         <property name="processEngineConfiguration" ref="processEngineConfiguration" />  
  24.     </bean>  
  25. </beans>  

4.画流程图

在项目中,在项目根目录下,点击new->other->选择Activiti下的Activiti Diagram新建一个流程图。

在其中画如下图示

并设好相关属性



5.Activiti测试代码

[java] view plain copy
  1. import java.io.File;  
  2. import java.io.InputStream;  
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import org.activiti.engine.ProcessEngine;  
  9. import org.activiti.engine.ProcessEngines;  
  10. import org.activiti.engine.repository.Deployment;  
  11. import org.activiti.engine.repository.DeploymentBuilder;  
  12. import org.activiti.engine.repository.DeploymentQuery;  
  13. import org.activiti.engine.repository.ProcessDefinition;  
  14. import org.activiti.engine.repository.ProcessDefinitionQuery;  
  15. import org.activiti.engine.runtime.ProcessInstance;  
  16. import org.activiti.engine.runtime.ProcessInstanceQuery;  
  17. import org.activiti.engine.task.Task;  
  18. import org.activiti.engine.task.TaskQuery;  
  19. import org.apache.commons.io.FileUtils;  
  20. import org.junit.Test;  
  21.   
  22. /** 
  23.  * 使用Activiti框架的API操作流程 
  24.  *  
  25.  * @author PuHaiyang 
  26.  * @createTime 2016年6月28日 下午4:50:39 
  27.  * @email 761396462@qq.com 
  28.  * @function Activiti基本功能测试 
  29.  * 
  30.  */  
  31. public class MyActivitiAPITest {  
  32.     ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
  33.   
  34.     @Test  
  35.     public void deployActiviti() {  
  36.         // 如果之前没有创建activiti相关的表,调用它会自动创建,由activiti-context.xml文件内容创建  
  37.         DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();  
  38.         deploymentBuilder.addClasspathResource("MyTest.bpmn");  
  39.         deploymentBuilder.addClasspathResource("MyTest.png");  
  40.         deploymentBuilder.name("i_am_name");  
  41.         Deployment deploy = deploymentBuilder.deploy();  
  42.         System.out.println(deploy.getId());  
  43.         // 部署信息表 insert into ACT_RE_DEPLOYMENT(ID_, NAME_, CATEGORY_,  
  44.         // DEPLOY_TIME_) values(?, ?, ?, ?)  
  45.         // 二进制数据表,bpmn文件插入 insert into ACT_GE_BYTEARRAY(ID_, REV_, NAME_,  
  46.         // BYTES_, DEPLOYMENT_ID_, GENERATED_) values (?, 1, ?, ?, ?, ?)  
  47.         // 二进制数据表,png文件插入 insert into ACT_GE_BYTEARRAY(ID_, REV_, NAME_, BYTES_,  
  48.         // DEPLOYMENT_ID_, GENERATED_) values (?, 1, ?, ?, ?, ?)  
  49.         // 流程定义数据表 insert into ACT_RE_PROCDEF(ID_, REV_, CATEGORY_, NAME_, KEY_,  
  50.         // VERSION_, DEPLOYMENT_ID_, RESOURCE_NAME_, DGRM_RESOURCE_NAME_,  
  51.         // DESCRIPTION_, HAS_START_FORM_KEY_, SUSPENSION_STATE_) values (?, 1,  
  52.         // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)  
  53.     }  
  54.   
  55.     /** 
  56.      * 查询部署列表 
  57.      */  
  58.     @Test  
  59.     public void queryDeployment() {  
  60.         DeploymentQuery deploymentQuery = processEngine.getRepositoryService().createDeploymentQuery();  
  61.         List<Deployment> list = deploymentQuery.list();  
  62.         for (Deployment deployment : list) {  
  63.             String id = deployment.getId();  
  64.             System.out.println(id);  
  65.         }  
  66.     }  
  67.   
  68.     /** 
  69.      * 删除部署信息 
  70.      */  
  71.     @Test  
  72.     public void deleteDeployment() {  
  73.         String deploymentId = "1";  
  74.         // 第二个参数代表级联操作  
  75.         processEngine.getRepositoryService().deleteDeployment(deploymentId, true);  
  76.         // 删除所有相关的activiti信息  
  77.     }  
  78.   
  79.     /** 
  80.      * 查询一次部署对应的流程定义文件名称和对应的输入流(bpmn png) 
  81.      *  
  82.      * @throws Exception 
  83.      */  
  84.     @Test  
  85.     public void queryDeploymentResource() throws Exception {  
  86.         String deploymentId = "101";  
  87.         List<String> names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);  
  88.         for (String name : names) {  
  89.             System.out.println(name);  
  90.             InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, name);  
  91.             // 将文件保存到本地磁盘  
  92.             // FileUtils来自commons-io-xxx.jar  
  93.             FileUtils.copyInputStreamToFile(in, new File("d:\\" + name));  
  94.             in.close();  
  95.         }  
  96.     }  
  97.   
  98.     /** 
  99.      * 获得流程表中流程图 
  100.      *  
  101.      * @throws Exception 
  102.      */  
  103.     @Test  
  104.     public void getProcessDiagream() throws Exception {  
  105.         String processDefinitionId = "myProcess:1:104";  
  106.         InputStream pngInputStream = processEngine.getRepositoryService().getProcessDiagram(processDefinitionId);  
  107.         FileUtils.copyInputStreamToFile(pngInputStream, new File("d:\\my.png"));  
  108.     }  
  109.   
  110.     /** 
  111.      * 启动流程实例 <br> 
  112.      * 方式一:根据流程定义的id启动 <br> 
  113.      * 方式二:根据流程定义的key启动(自动选择最新版本的流程定义启动流程实例) 
  114.      */  
  115.     @Test  
  116.     public void startProcess() {  
  117.         /* 
  118.          * 方式一:根据流程定义的id启动 String processDefinitionId = "myProcess:1:104"; 
  119.          * ProcessInstance processInstance = 
  120.          * processEngine.getRuntimeService().startProcessInstanceById 
  121.          * (processDefinitionId ); System.out.println(processInstance.getId()); 
  122.          */  
  123.   
  124.         // 方式二:根据流程定义的key启动(自动选择最新版本的流程定义启动流程实例)  
  125.         String processDefinitionKey = "myProcess";  
  126.         ProcessInstance processInstance = processEngine.getRuntimeService()  
  127.                 .startProcessInstanceByKey(processDefinitionKey);  
  128.         System.out.println(processInstance.getId());  
  129.         // 调用SQL语句如下  
  130.         // 1 ACT_RU_EXECUTION 运行时流程执行实例表  
  131.         // insert into ACT_RU_EXECUTION (ID_, REV_, PROC_INST_ID_,  
  132.         // BUSINESS_KEY_, PROC_DEF_ID_, ACT_ID_, IS_ACTIVE_, IS_CONCURRENT_,  
  133.         // IS_SCOPE_,IS_EVENT_SCOPE_, PARENT_ID_, SUPER_EXEC_,  
  134.         // SUSPENSION_STATE_, CACHED_ENT_STATE_) values ( ?, 1, ?, ?, ?, ?, ?,  
  135.         // ?, ?, ?, ?, ?, ?, ? )  
  136.   
  137.         // 2 ACT_HI_PROCINST 历史流程实例表  
  138.         // insert into ACT_HI_PROCINST ( ID_, PROC_INST_ID_, BUSINESS_KEY_,  
  139.         // PROC_DEF_ID_, START_TIME_, END_TIME_, DURATION_, START_USER_ID_,  
  140.         // START_ACT_ID_, END_ACT_ID_, SUPER_PROCESS_INSTANCE_ID_,  
  141.         // DELETE_REASON_ ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )  
  142.   
  143.         // 3 ACT_HI_ACTINST 历史节点表  
  144.         // insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_,  
  145.         // EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_,  
  146.         // ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_ ) values ( ?,  
  147.         // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )  
  148.   
  149.         // 4 ACT_HI_ACTINST 历史节点表  
  150.         // insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_,  
  151.         // EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_,  
  152.         // ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_ ) values ( ?,  
  153.         // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )  
  154.   
  155.         // 5 ACT_RU_TASK 运行时任务节点表  
  156.         // insert into ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_,  
  157.         // DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_,  
  158.         // DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_,  
  159.         // TASK_DEF_KEY_, DUE_DATE_, SUSPENSION_STATE_) values (?, 1, ?, ?, ?,  
  160.         // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )  
  161.   
  162.         // 6 ACT_HI_TASKINST 历史任务实例表  
  163.         // insert into ACT_HI_TASKINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_,  
  164.         // EXECUTION_ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, OWNER_,  
  165.         // ASSIGNEE_, START_TIME_, CLAIM_TIME_, END_TIME_, DURATION_,  
  166.         // DELETE_REASON_, TASK_DEF_KEY_, FORM_KEY_, PRIORITY_, DUE_DATE_ )  
  167.         // values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )  
  168.   
  169.         // 7 ACT_RU_IDENTITYLINK 运行时流程人员表,主要存储任务节点与参与者的相关信息  
  170.         // insert into ACT_RU_IDENTITYLINK (ID_, REV_, TYPE_, USER_ID_,  
  171.         // GROUP_ID_, TASK_ID_, PROC_INST_ID_, PROC_DEF_ID_) values (?, 1, ?, ?,  
  172.         // ?, ?, ?, ?)  
  173.   
  174.         // 8 ACT_HI_IDENTITYLINK 历史流程人员表  
  175.         // insert into ACT_HI_IDENTITYLINK (ID_, TYPE_, USER_ID_, GROUP_ID_,  
  176.         // TASK_ID_, PROC_INST_ID_) values (?, ?, ?, ?, ?, ?)  
  177.   
  178.     }  
  179.   
  180.     /** 
  181.      * 查询流程实例列表,查询act_ru_execution表 
  182.      */  
  183.     @Test  
  184.     public void queryRuntimeProcess() {  
  185.         // 流程实例查询对象,查询act_ru_execution表  
  186.         ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery();  
  187.         query.processDefinitionKey("myProcess");  
  188.         query.orderByProcessInstanceId().desc();  
  189.         query.listPage(02);  
  190.         List<ProcessInstance> list = query.list();  
  191.         for (ProcessInstance pi : list) {  
  192.             System.out.println(pi.getId() + " " + pi.getActivityId());  
  193.         }  
  194.     }  
  195.   
  196.     /** 
  197.      * 不通过<br> 
  198.      * 删除流程实例 
  199.      */  
  200.     @Test  
  201.     public void deleteProcess() {  
  202.         String processInstanceId = "201";  
  203.         processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, "不准逃课!");  
  204.   
  205.         // 执行删除部分SQL如下  
  206.         // 1 ACT_RU_TASK 运行时任务节点表  
  207.         // delete from ACT_RU_TASK where ID_ = ? and REV_ = ?  
  208.   
  209.         // 2 ACT_RU_IDENTITYLINK 运行时流程人员表,主要存储任务节点与参与者的相关信息  
  210.         // delete from ACT_RU_IDENTITYLINK where ID_ = ?  
  211.   
  212.         // 3 ACT_RU_EXECUTION 运行时流程执行实例表  
  213.         // delete from ACT_RU_EXECUTION where ID_ = ? and REV_ = ?  
  214.   
  215.         // 执行更新部分SQL如下  
  216.         // 1 ACT_HI_PROCINST 历史流程实例表  
  217.         // update ACT_HI_PROCINST set PROC_DEF_ID_ = ?, START_TIME_ = ?,  
  218.         // END_TIME_ = ?, DURATION_ = ?, END_ACT_ID_ = ?, DELETE_REASON_ = ?  
  219.         // where ID_ = ?  
  220.   
  221.         // 2 ACT_HI_ACTINST 历史节点表  
  222.         // update ACT_HI_ACTINST set EXECUTION_ID_ = ?, ASSIGNEE_ = ?, END_TIME_  
  223.         // = ?, DURATION_ = ? where ID_ = ?  
  224.   
  225.         // 3 ACT_HI_TASKINST 历史任务实例表  
  226.         // update ACT_HI_TASKINST set EXECUTION_ID_ = ?, NAME_ = ?,  
  227.         // PARENT_TASK_ID_ = ?, DESCRIPTION_ = ?, OWNER_ = ?, ASSIGNEE_ = ?,  
  228.         // CLAIM_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ?,  
  229.         // TASK_DEF_KEY_ = ?, FORM_KEY_ = ?, PRIORITY_ = ?, DUE_DATE_ = ? where  
  230.         // ID_ = ?  
  231.     }  
  232.   
  233.     /** 
  234.      * 查询任务 
  235.      */  
  236.     @Test  
  237.     public void queryTask() {  
  238.         // 任务查询对象,查询act_ru_task表  
  239.         TaskQuery query = processEngine.getTaskService().createTaskQuery();  
  240.         String assignee = "班主任";  
  241.         query.taskAssignee(assignee);  
  242.         query.orderByTaskCreateTime().desc();  
  243.         List<Task> list = query.list();  
  244.         for (Task task : list) {  
  245.             System.out.println(task.getId());  
  246.         }  
  247.         // 执行sql如下  
  248.         // 1 ACT_GE_PROPERTY 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,  
  249.         // select * from ACT_GE_PROPERTY where NAME_ = ?  
  250.   
  251.         // 2 ACT_RU_TASK 运行时任务节点表  
  252.         // select distinct RES.* from ACT_RU_TASK RES WHERE RES.ASSIGNEE_ = ?  
  253.         // order by RES.CREATE_TIME_ desc LIMIT ? OFFSET ?  
  254.     }  
  255.   
  256.     /** 
  257.      * 处理任务 
  258.      */  
  259.     @Test  
  260.     public void completeTask() {  
  261.         String taskId = "304";  
  262.         processEngine.getTaskService().complete(taskId);  
  263.   
  264.         // 执行的主要SQL如下  
  265.         // 1 ACT_GE_PROPERTY 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录  
  266.         // update ACT_GE_PROPERTY SET REV_ = ?, VALUE_ = ? where NAME_ = ? and  
  267.         // REV_ = ?  
  268.   
  269.         // 2 ACT_HI_ACTINST 历史节点表  
  270.         // insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_,  
  271.         // EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_,  
  272.         // ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_ ) values ( ?,  
  273.         // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )  
  274.   
  275.         // 3 ACT_RU_TASK 运行时任务节点表  
  276.         // insert into ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_,  
  277.         // DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_,  
  278.         // DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_,  
  279.         // TASK_DEF_KEY_, DUE_DATE_, SUSPENSION_STATE_) values (?, 1, ?, ?, ?,  
  280.         // ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )  
  281.   
  282.         // 4 ACT_HI_TASKINST 历史任务实例表  
  283.         // insert into ACT_HI_TASKINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_,  
  284.         // EXECUTION_ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, OWNER_,  
  285.         // ASSIGNEE_, START_TIME_, CLAIM_TIME_, END_TIME_, DURATION_,  
  286.         // DELETE_REASON_, TASK_DEF_KEY_, FORM_KEY_, PRIORITY_, DUE_DATE_ )  
  287.         // values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )  
  288.   
  289.         // 5 ACT_RU_IDENTITYLINK 运行时流程人员表,主要存储任务节点与参与者的相关信息  
  290.         // insert into ACT_RU_IDENTITYLINK (ID_, REV_, TYPE_, USER_ID_,  
  291.         // GROUP_ID_, TASK_ID_, PROC_INST_ID_, PROC_DEF_ID_) values (?, 1, ?, ?,  
  292.         // ?, ?, ?, ?)  
  293.   
  294.         // 6 ACT_HI_IDENTITYLINK 历史流程人员表  
  295.         // insert into ACT_HI_IDENTITYLINK (ID_, TYPE_, USER_ID_, GROUP_ID_,  
  296.         // TASK_ID_, PROC_INST_ID_) values (?, ?, ?, ?, ?, ?)  
  297.   
  298.         // 7 ACT_HI_TASKINST 历史任务实例表  
  299.         // update ACT_HI_TASKINST set EXECUTION_ID_ = ?, NAME_ = ?,  
  300.         // PARENT_TASK_ID_ = ?, DESCRIPTION_ = ?, OWNER_ = ?, ASSIGNEE_ = ?,  
  301.         // CLAIM_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ?,  
  302.         // TASK_DEF_KEY_ = ?, FORM_KEY_ = ?, PRIORITY_ = ?, DUE_DATE_ = ? where  
  303.         // ID_ = ?  
  304.   
  305.         // 8 ACT_RU_EXECUTION 运行时流程执行实例表  
  306.         // update ACT_RU_EXECUTION set REV_ = ?, PROC_DEF_ID_ = ?, ACT_ID_ = ?,  
  307.         // IS_ACTIVE_ = ?, IS_CONCURRENT_ = ?, IS_SCOPE_ = ?, IS_EVENT_SCOPE_ =  
  308.         // ?, PARENT_ID_ = ?, SUPER_EXEC_ = ?, SUSPENSION_STATE_ = ?,  
  309.         // CACHED_ENT_STATE_ = ? where ID_ = ? and REV_ = ?  
  310.   
  311.         // 9 ACT_HI_ACTINST 历史节点表  
  312.         // update ACT_HI_ACTINST set EXECUTION_ID_ = ?, ASSIGNEE_ = ?, END_TIME_  
  313.         // = ?, DURATION_ = ? where ID_ = ?  
  314.   
  315.         // 10 ACT_RU_TASK 运行时任务节点表  
  316.         // delete from ACT_RU_TASK where ID_ = ? and REV_ = ?  
  317.   
  318.     }  
  319.   
  320.     /** 
  321.      * 直接将流程向下执行一步 
  322.      */  
  323.     @Test  
  324.     public void signal() {  
  325.         String executionId = "301";// 流程实例id  
  326.         processEngine.getRuntimeService().signal(executionId);  
  327.     }  
  328.   
  329.     /** 
  330.      * 查询最新版本的流程定义列表 
  331.      */  
  332.     @Test  
  333.     public void getLastTasks() {  
  334.         ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();  
  335.         query.orderByProcessDefinitionVersion().asc();  
  336.         List<ProcessDefinition> list = query.list();  
  337.         Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>();  
  338.         for (ProcessDefinition pd : list) {  
  339.             map.put(pd.getKey(), pd);  
  340.         }  
  341.         ArrayList<ProcessDefinition> lastList = new ArrayList<>(map.values());  
  342.         for (ProcessDefinition processDefinition : lastList) {  
  343.             System.out.println(processDefinition.getName() + "  " + processDefinition.getVersion());  
  344.         }  
  345.     }  
  346. }