范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Activiti7工作流的使用

  1 Activiti服务架构#1.1 概述#
  1.2 activiti-cfg.xml#activiti-cfg.xml是activiti的引擎配置文件,包括:ProcessEngineConfiguration的定义、数据源的定义、事务管理器等,此文件其实就是一个Spring配置文件,下面是一个基本的配置只配置了ProcessEngineConfiguration和数据源。  <?xml version="1.0" encoding="UTF-8"?>                                                                                                                             1.3 ProcessEngineConfiguration#1.3.1 概述#流程引擎的配置类,通过ProcessEngineConfiguration可以创建工作流引擎ProcessEngine,常用的两种方法如下:  1.3.2 StandaloneProcessEngineConfiguration#通过org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration,Activiti可以单独运行,使用它创建的ProcessEngine,Activiti会自己处理事务。  配置文件方式:  通常在activiti-cfg.xml配置文件中定义一个id为processEngineConfiguration的Bean,这里会使用Spring的依赖注入来构建引擎。              1.3.3 SpringProcessEngineConfiguration#通过org.activiti.spring.SpringProcessEngineConfiguration和Spring整合。  <?xml version="1.0" encoding="UTF-8"?>                                                                                                                                                                                                                                                                                                                                                                                                              1.3.4 创建ProcessEngineConfiguration#下面的方法:要求activiti-cfg.xml中必须由一个processEngineConfiguration的Bean的id。  public static ProcessEngineConfiguration createProcessEngineConfigurationFromResource(String resource) {     return createProcessEngineConfigurationFromResource(resource, "processEngineConfiguration"); } 下面的方法,可以更改Bean的id。  public static ProcessEngineConfiguration createProcessEngineConfigurationFromResource(String resource, String beanName) {     return BeansConfigurationHelper.parseProcessEngineConfigurationFromResource(resource, beanName); } 1.4 ProcessEngine#工作流引擎,相当于一个门面接口,通过ProcessEngineConfiguration创建ProcessEngine,通过ProcessEngine创建各个Service接口。  1.4.1 一般创建方式#示例:  package com.sunxiaping;  import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration;  /**  * @author weiwei.xu  * @version 1.0  * 2020-07-31 6:41  */ public class ActivitiTest {      public static void main(String[] args) {         //创建ProcessEngineConfiguration对象         ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");         //创建ProcessEngine对象         ProcessEngine processEngine = configuration.buildProcessEngine();         System.out.println("processEngine = " + processEngine);     } } 1.4.2 简单创建方式#将activiti.cfg.xml文件名以及路径固定,且activiti.cfg.xml文件中有processEngineConfiguration的配置,那么可以使用如下代码创建ProcessEngine。  package com.sunxiaping;  import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines;  /**  * @author weiwei.xu  * @version 1.0  * 2020-07-31 6:41  */ public class ActivitiTest {      public static void main(String[] args) {         //该方法有限制         //①Activiti的配置文件名必须为activiti.cfg.xml         //②Bean的id必须是processEngineConfiguration         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();         System.out.println("processEngine = " + processEngine);     }  } 1.5 Service#1.5.1 Service的创建方式#通过ProcessEngine创建Service,Service是工作流引擎提供用于进行工作流部署、指定、管理的服务接口。  创建方式如下:  package com.sunxiaping;  import org.activiti.engine.*;  /**  * @author weiwei.xu  * @version 1.0  * 2020-07-31 11:55  */ public class ActivitiTest {      public static void main(String[] args) {         //创建ProcessEngineConfiguration对象         ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");         //创建ProcessEngine对象         ProcessEngine processEngine = configuration.buildProcessEngine();          RepositoryService repositoryService = processEngine.getRepositoryService();         RuntimeService runtimeService = processEngine.getRuntimeService();         TaskService taskService = processEngine.getTaskService();         HistoryService historyService = processEngine.getHistoryService();         ManagementService managementService = processEngine.getManagementService();          System.out.println("repositoryService = " + repositoryService);         System.out.println("runtimeService = " + runtimeService);         System.out.println("taskService = " + taskService);         System.out.println("historyService = " + historyService);         System.out.println("managementService = " + managementService);      } } 1.5.2 Service总览#
  Service接口
  说明
  RepositoryService
  Activiti的资源管理接口
  RuntimeService
  Activiti的流程运行管理接口
  TaskService
  Activiti的任务管理接口
  HistoryService
  Activiti的历史管理接口
  ManagementService
  Activiti的引擎管理接口  1.5.3 RepositoryService#RepositoryService,是Activiti的资源管理接口,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的业务流程图需要使用此Service将流程定义文件的内容部署到计算机中。  除了流程部署定义以外还可以做如下的操作:1 查询引擎中的发布包和流程定义。2 暂停或激活发布包以及对应全部和特定流程定义。暂停意味着它们不能再在执行任务操作了,激活是对应的反向操作。3 获取多种资源,像包含在发布包中的文件获引擎自动生成的流程图。4 获取流程定义的POJO,可以用解析流程,而不必通过XML。  1.5.4 RuntimeService#RuntimeService是Activiti的流程运行管理接口,可以从这个接口中获取很多关于流程执行相关的信息。  1.5.5 TaskService#TaskService是Activiti的任务管理接口,可以从这个接口中获取任务的信息。  1.5.6 HistoryService#HistoryService是Activiti的历史管理类,可以查询历史信息,执行流程时,引擎会包含很多数据(根据配置),比如流程实例启动时间,任务的参与者,完成任务的时间,每个流程实例的执行路径,等等。  1.5.7 ManagementService#ManagementService是Activiti的引擎管理接口,提供了对Activiti流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于Activiti系统的日常维护。  2 Activiti入门体验#2.1 流程定义#2.1.1 画板#在IDEA中安装对应的Activiti-Designer(Activiti设计器)插件即可使用,画板中包括以下结点:  Connection--连接。  Event--事件。  Task--任务。  Gateway--网关。  Container--容器。  Boundary event--边界事件。  Intermediate event--中间事件。  流程图设计完毕保存生成.bpmn文件。  本人此时使用的IDEA版本是2020.2,而IDEA中的Activiti设计器插件actiBPM到此时位置已停止更新了。
  本人只能使用Eclipse画流程图。Eclipse需要安装Activiti插件,略。  2.1.2 绘制流程#
  2.1.3 指定流程定义key#流程定义key即流程定义的标识。
  建议:相同的业务流程,流程定义的key名字定义一样。如果需要创建新的业务流程,则使用新的key。
  2.1.4 指定任务负责人#为每个任务结点指定负责人,如添加请假单的负责人是张三。
  2.2 部署流程定义#将刚才生成的holiday.bpmn和holiday.png拷贝到项目的resources目录下。
  示例:使用RepositoryService部署流程定义  package com.sunxiaping;  import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.junit.Test;  /**  * @author weiwei.xu  * @version 1.0  * 2020-07-31 11:55  */ public class ActivitiDeploymentTest {      /**      * 部署流程定义:将下面代码中指定的bpmn文件和png文件保存到Activiti数据库中      *      * act_re_deployment 部署信息      * act_re_procdef 流程定义的一些信息      * act_ge_bytearray 流程定义bpmn文件和png文件      */     @Test     public void test() {         //创建ProcessEngineConfiguration对象         ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");         ProcessEngine processEngine = configuration.buildProcessEngine();         //获取RepositoryService对象         RepositoryService repositoryService = processEngine.getRepositoryService();         //进行部署         Deployment deployment = repositoryService.createDeployment()                 .addClasspathResource("diagram/holiday.bpmn") //添加bpmn资源                 .addClasspathResource("diagram/holiday.png")                 .name("请假申请流程")                 .deploy(); //部署         //输出部署的一些信息         String id = deployment.getId();         System.out.println("流程部署id = " + id);         String name = deployment.getName();         System.out.println("流程部署名称 = " + name);     }  } 2.3 启动一个流程实例#流程定义部署在Activiti中之后就可以通过工作流管理业务流程了。  针对该流程,启动一个流程表示发起一个新的请假申请单,这就相当于Java类和Java对象的关系,类定义好之后需要new创建一个对象使用,当然,也可以new多个对象。  对于请假申请流程,张三发起一个请假申请单需要启动一个流程实例,李四发起一个请求申请单也需要启动一个流程实例。  关系:
  流程定义(BPMN文件)-->流程部署(Activiti的三张表)。
  流程实例-->启动流程实例。
  类比:
  流程定义类似于Java中的类,流程实例类似于Java中的一个实例(对象),所以一个流程定义key对应多个不同的流程实例。 示例:  package com.sunxiaping;  import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.RuntimeService; import org.activiti.engine.runtime.ProcessInstance; import org.junit.Test;  /**  * @author weiwei.xu  * @version 1.0  * 2020-08-01 14:35  */ public class ActivitiStartProcessInstanceTest {      /**      * act_hi_actinst 活动实例      * act_hi_identitylink 参与者信息      * act_hi_procinst 流程实例      * act_hi_taskinst 任务实例      * act_ru_execution 执行表      * act_ru_identitylink 参与者信息      * act_ru_task   任务表      */     @Test     public void test() {         //创建ProcessEngineConfiguration对象         ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");         ProcessEngine processEngine = configuration.buildProcessEngine();         //获取RuntimeService对象         RuntimeService runtimeService = processEngine.getRuntimeService();         //根据流程定义的key启动流程实例         ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday");         //获取流程实例的相关信息         String processDefinitionId = processInstance.getProcessDefinitionId();         System.out.println("流程定义的id = " + processDefinitionId);         String deploymentId = processInstance.getDeploymentId();         System.out.println("流程部署的id = " + deploymentId);         String id = processInstance.getId();         System.out.println("流程实例的id = " + id);         String activityId = processInstance.getActivityId();         System.out.println("当前活动的id = " + activityId);      } } 2.4 任务查询#流程启动后,各个任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。  示例:  package com.sunxiaping;  import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.TaskService; import org.activiti.engine.task.Task; import org.junit.Test;  import java.util.List;  /**  * @author weiwei.xu  * @version 1.0  * 2020-08-01 15:00  */ public class ActivitiTaskTest {      /**      * act_ru_task      */     @Test     public void test() {         //任务负责人         String assignee = "张三";         //创建ProcessEngineConfiguration对象         ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");         ProcessEngine processEngine = configuration.buildProcessEngine();         //获取TaskService对象         TaskService taskService = processEngine.getTaskService();         //查询任务列表,根据流程定义的key和任务负责人         List taskList = taskService.createTaskQuery().processDefinitionKey("holiday").taskAssignee(assignee).list();         //遍历任务列表         for (Task task : taskList) {             String processDefinitionId = task.getProcessDefinitionId();             System.out.println("流程定义id = " + processDefinitionId);             String processInstanceId = task.getProcessInstanceId();             System.out.println("流程实例id = " + processInstanceId);             String assignee1 = task.getAssignee();             System.out.println("任务负责人 = " + assignee1);             String id = task.getId();             System.out.println("任务id = " + id);             String name = task.getName();             System.out.println("任务名称 = " + name);         }     } } 2.5 任务处理#任务负责人查询待办任务,选择任务进行处理,完成任务。  示例:  package com.sunxiaping;  import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.TaskService; import org.activiti.engine.task.Task; import org.junit.Test;  import java.util.List;  /**  * @author weiwei.xu  * @version 1.0  * 2020-08-01 15:20  */ public class ActivitiTaskCompleteTest {      /**      * act_hi_actinst 活动实例      * act_hi_identitylink 参与者信息      * act_hi_taskinst 任务实例      * act_ru_execution 执行表      * act_ru_identitylink 参与者信息      * act_ru_task 任务表      */     @Test     public void test() {         //任务负责人         String assignee = "张三";         //创建ProcessEngineConfiguration对象         ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");         ProcessEngine processEngine = configuration.buildProcessEngine();         //获取TaskService对象         TaskService taskService = processEngine.getTaskService();         //查询任务列表,根据流程定义的key和任务负责人         List taskList = taskService.createTaskQuery().processDefinitionKey("holiday").taskAssignee(assignee).list();         //遍历任务列表         for (Task task : taskList) {             String id = task.getId();             //完成任务             taskService.complete(id);         }     }  } 3 流程定义#3.1 流程定义概述#3.1.1 什么是流程定义?#流程定义是按照BPMN2.0标准去描述业务流程,通常使用Activiti-explorer(Activiti控制台)或Activiti-eclipse-designer(Activiti的eclipse设计器)插件对业务流程进行建模,这两种方式都遵循BPMN2.0标准。  如果使用Activiti-eclipse-designer插件完成业务流程建模。可以生成两个文件:.bpmn和.png文件。  3.1.2 bpmn文件#.bpmn文件其实就是XML文件。                                                                                                                                                                                                                                                                                                                          .bpmn文件的根节点是definitions节点。这个元素中,可以定义多个流程定义(建议每个文件只包含一个流程定义,可以简化开发过程中的维护难度)。注意,definitions元素最少也要包含xmlns和targetNamespace的声明。targetNamespace可以是任何值,它用来对流程实例进行分类。  流程定义部分:定义了流程每个结点的描述和结点之间的流程流转。  流程布局定义:定义流程每个结点在流程图上的位置坐标等信息。  3.1.3 png图片文件#如果是在Eclipse中,需要进行如下的配置:
  3.2 流程定义部署#3.2.1 什么是流程定义部署#将生成的流程定义部署到Activiti的数据库中,这就是流程定义部署,通过调用Activiti的API将流程定义的bpmn和png两个文件一个一个添加部署到Activiti中,也可以将两个文件打成zip包进行部署。  3.2.2 单个文件部署方式#分别将bpmn文件和png图片文件部署。  示例:  package com.sunxiaping;  import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.junit.Test;  /**  * @author weiwei.xu  * @version 1.0  * 2020-07-31 11:55  */ public class ActivitiDeploymentTest {      /**      * 部署流程定义:将下面代码中指定的bpmn文件和png文件保存到Activiti数据库中      *      * act_re_deployment 部署信息      * act_re_procdef 流程定义的一些信息      * act_ge_bytearray 流程定义bpmn文件和png文件      */     @Test     public void test() {         //创建ProcessEngineConfiguration对象         ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");         ProcessEngine processEngine = configuration.buildProcessEngine();         //获取RepositoryService对象         RepositoryService repositoryService = processEngine.getRepositoryService();         //进行部署         Deployment deployment = repositoryService.createDeployment()                 .addClasspathResource("diagram/holiday.bpmn") //添加bpmn资源                 .addClasspathResource("diagram/holiday.png")                 .name("请假申请流程")                 .deploy(); //部署         //输出部署的一些信息         String id = deployment.getId();         System.out.println("流程部署id = " + id);         String name = deployment.getName();         System.out.println("流程部署名称 = " + name);     } } 3.2.3 压缩包部署方式#将.bpmn文件和.png图片压缩成一个zip包。
  示例:  package com.sunxiaping;  import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.junit.Test;  import java.io.InputStream; import java.util.zip.ZipInputStream;  /**  * @author weiwei.xu  * @version 1.0  * 2020-07-31 11:55  */ public class ActivitiZipDeploymentTest {      /**      * 部署流程定义:将下面代码中指定的bpmn文件和png文件保存到Activiti数据库中      *      * act_re_deployment 部署信息      * act_re_procdef 流程定义的一些信息      * act_ge_bytearray 流程定义bpmn文件和png文件      */     @Test     public void test() {         //创建ProcessEngineConfiguration对象         ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");         ProcessEngine processEngine = configuration.buildProcessEngine();         //获取RepositoryService对象         RepositoryService repositoryService = processEngine.getRepositoryService();          InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("diagram/holiday.zip");          ZipInputStream zipInputStream = new ZipInputStream(inputStream);          //进行部署         Deployment deployment = repositoryService.createDeployment()                 .addZipInputStream(zipInputStream)                 .name("请假申请流程")                 .deploy(); //部署         //输出部署的一些信息         String id = deployment.getId();         System.out.println("流程部署id = " + id);         String name = deployment.getName();         System.out.println("流程部署名称 = " + name);     } } 3.2.4 操作数据表#流程定义部署后,会操作三张表:act_re_deployment、act_re_procdef和act_ge_bytearray。  act_re_deployment是流程定义部署表,记录流程部署信息。  act_re_procdef是流程定义表,记录流程定义信息。  act_ge_bytearray是资源表,将.bpmn文件和.png图片存入到这个表。  说明:
  act_re_deployment和act_re_procdef是一对多的关系,一次部署在流程部署表生成一条记录,但一次流程部署可以部署多个流程定义,每个流程定义在流程定义表生成一条记录。每一个流程定义在act_ge_bytearray会存在两个资源记录.bpmn文件和.png图片。
  建议:
  一次部署一个流程,这样部署表和流程定义表示一对一的关系,方便读取流程部署和流程定义信息。 3.3 流程定义查询#示例:  package com.sunxiaping;  import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.repository.ProcessDefinitionQuery; import org.junit.Test;  import java.util.List;  /**  * @author weiwei.xu  * @version 1.0  * 2020-08-01 21:24  */ public class ActivitiProcessDefinitionQueryTest {      /**      * 查询流程定义信息      */     @Test     public void test() {         //创建ProcessEngineConfiguration对象         ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");         ProcessEngine processEngine = configuration.buildProcessEngine();         //获取RepositoryService对象         RepositoryService repositoryService = processEngine.getRepositoryService();         //得到ProcessDefinitionQuery对象         ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();         //设置条件,并查询出当前的所有流程定义         List processDefinitionList = processDefinitionQuery.processDefinitionKey("holiday")                 .orderByProcessDefinitionVersion()                 .desc()                 .list();         //输出流程定义信息         for (ProcessDefinition processDefinition : processDefinitionList) {             System.out.println("流程定义的id = " + processDefinition.getId());             System.out.println("流程定义的name = " + processDefinition.getName());             System.out.println("流程定义的key = " + processDefinition.getKey());             System.out.println("流程定义的version = " + processDefinition.getVersion());         }     } } 3.4 流程定义删除#示例:  package com.sunxiaping;  import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.RepositoryService; import org.junit.Test;  /**  * @author weiwei.xu  * @version 1.0  * 2020-08-01 21:13  */ public class ActivitiDeleteProcessDefinitionTest {      /**      * 删除已经部署的流程定义      *      * 注意事项:      *  ①当我们正在执行的这一套流程没有结束,此时如果要删除流程定义信息就会失败(调用void deleteDeployment(String deploymentId)方法)。      *  ②当我们正在执行的这一套流程没有结束,此时如果要强制删除流程定义信息,需要调用void deleteDeployment(String deploymentId, boolean cascade)这个方式,将cascade设置为true。      */     @Test     public void test() {         //创建ProcessEngineConfiguration对象         ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");         ProcessEngine processEngine = configuration.buildProcessEngine();         //获取RepositoryService对象         RepositoryService repositoryService = processEngine.getRepositoryService();         //删除已经部署的流程定义         String deploymentId = "1";         repositoryService.deleteDeployment(deploymentId);     } }  3.5 流程定义资源查询#示例:通过查询流程定义对象获取流程定义资源,即bpmn和png  package com.sunxiaping;  import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.repository.ProcessDefinitionQuery; import org.junit.Test; import org.springframework.util.FileCopyUtils;  import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List;  /**  * @author weiwei.xu  * @version 1.0  * 2020-08-02 10:22  */ public class ActivitiResourceTest {      @Test     public void test() throws IOException {         //创建ProcessEngineConfiguration对象         ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");         ProcessEngine processEngine = configuration.buildProcessEngine();         //获取RepositoryService对象         RepositoryService repositoryService = processEngine.getRepositoryService();         //获取ProcessDefinitionQuery对象         ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();         //设置查询条件,执行查询操作         List processDefinitionList = processDefinitionQuery.processDefinitionKey("holiday").orderByProcessDefinitionVersion().desc().list();         //遍历查询结果         for (ProcessDefinition processDefinition : processDefinitionList) {             //获取资源名称,即png图片的名称             String resourceName = processDefinition.getResourceName();             //获取图表资源,即bpmn图片的名称             String diagramResourceName = processDefinition.getDiagramResourceName();             //获取资源的输入流,即png图片的输入流             InputStream resourceNameInputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), resourceName);             InputStream diagramResourceNameInputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), diagramResourceName);              String resourcePath = "d:" + File.separator + resourceName;             File file = new File(resourcePath);             if (!file.exists()) {                 file.getParentFile().mkdirs();             }              String diagramResourcePath = "d:" + File.separator + diagramResourceName;             file = new File(diagramResourcePath);             if (!file.exists()) {                 file.getParentFile().mkdirs();             }              //复制文件             FileCopyUtils.copy(resourceNameInputStream, new FileOutputStream(resourcePath));             FileCopyUtils.copy(diagramResourceNameInputStream, new FileOutputStream(diagramResourcePath));         }     } } 3.6 流程历史信息查询#示例:  package com.sunxiaping;  import org.activiti.engine.HistoryService; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngineConfiguration; import org.activiti.engine.history.HistoricActivityInstance; import org.activiti.engine.history.HistoricActivityInstanceQuery; import org.junit.Test;  import java.util.List;  /**  * @author weiwei.xu  * @version 1.0  * 2020-08-01 21:13  */ public class ActivitiHistoryTest {      @Test     public void test() {         //创建ProcessEngineConfiguration对象         ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-cfg.xml");         //获取ProcessEngine对象         ProcessEngine processEngine = configuration.buildProcessEngine();         //获取HistoryService对象         HistoryService historyService = processEngine.getHistoryService();         //获取HistoricActivityInstanceQuery查询对象         HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();         List 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);         }      } }
  如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,
  咱们下期见!学习更多JAVA知识与技巧(获取原文),关注与私信博主(666)

电话邦发布2022年度骚扰诈骗电话形势报告打造智能平台防骚扰近年来,骚扰诈骗电话作为社会难点问题一直困扰着广大人民群众,并具有发生频繁上升速度快和屡禁不止等特点,为了配合工信部及时有效的整治骚扰诈骗电话,电话邦联合可信号码数据中心发布了20人工智能大火让芯片产业迎来风口!中企必须走向全能!来源环球时报环球时报报道记者赵觉珵甄翔人工智能领域在2023年大火,也将热度烧到了芯片行业。在海外,英伟达等国际头部芯片厂商伴随需求预期的大涨,正收获越来越多资本青睐。美股13日交纳芯微研究报告数字隔离芯片龙头,打造多品类模拟电路平台(报告出品方东方证券)1模拟芯片细分赛道领军者,业绩步入高增长轨道1。1专注模拟芯片业务,发力泛工业汽车应用领域纳芯微专注于模拟芯片的研发设计与销售,产品广泛应用于下游各个领域。公预见2023!平台经济迎来发展新窗口中国小康网独家专稿文小康中国小康网孙媛媛以BAT京东抖音拼多多快手等为代表的平台经济,正在迎来新一轮发展机遇,数实融合互联网赋能实体经济将是2023年平台经济发展的主旋律。供图受访比光刻机更重要?中国突破关键领域核心技术,该来的终于来了光刻机是芯片制造的重要设备,如果没有光刻机,芯片将无法被造出来。但是芯片行业并非都依赖光刻机,根据芯片种类,工艺的不同,使用的制造设备也是有区别的。比如生产量子芯片,使用的设备包括爱优腾们会因大力度限制会员分享更赚钱吗?图源视觉中国2月13日,有网友反映多台设备同时登腾讯视频账号被封。对此,腾讯视频客服回应称同一腾讯视频VIP账号只允许本人在最多5个设备上使用,同一时间同一腾讯视频VIP账号最多可暗中诱导消费,侵犯孩子隐私儿童智能手表里或潜藏大灰狼来源法治日报本报记者文丽娟智能手表里暗藏大灰狼!这句话如今已成为北京市民刘维和女儿聊天时的口头禅。刘维的女儿今年8岁,沉迷于表圈(智能手表好友圈)近3年时间。往常,他放任女儿和好友梦幻联动览邦WACHMAXA90智能手表和F9FreeBudsPlus蓝牙耳机随着智能科技的发展,越来越多用户追求高品质的数码产品,而国内数码产品也出现了两匹黑马,它们就是览邦WACHMAXA90智能手表和览邦F9FreeBudsPlus多模式主动降噪真无线2023快手电商38节商家大会即将召开2月16日1400,2023年快手电商38节商家大会将于线上开启直播。本次大会主题为春季上新,赢在开年,快手电商官方将带领商家精准把握38节增长趋势,取得确定性的生意增长。会上,5关于建筑机器人应用的推广与建议笔者注意到,住建部等十七部门印发了机器人应用行动实施方案(工信部联通装2022187号)。在建筑业方面,引导推进建筑机器人拓展应用空间,助力智能建造与新型建筑工业化协同发展。推广建中国天眼已发现740余颗新脉冲星2月13日拍摄的中国天眼局部。2月13日,工作人员从中国天眼的圈梁上经过。以上图片均为新华社记者欧东衢摄本报北京2月14日电(记者吴月辉)记者14日从中国科学院国家天文台获悉截至目
40107!奥拉迪波连创神迹比肩韦德或成热火争冠奇兵北京时间4月11日,在热火提前锁定东部常规赛冠军情况下,他们收官战雪藏主力输给魔术,但奥拉迪波打出大爆发一战。此役,奥拉迪波出战35分钟,奉献22投13中(其中外线三分11中5),球迷母亲实际上C罗并没有向我们道歉我的孩子整夜未眠北京时间4月11日讯,曼联球星克里斯蒂亚诺罗纳尔多正面临警方和英足总的调查,因为他涉嫌殴打的埃弗顿球迷的母亲公开了他令人震惊的道歉企图。莎拉凯利和她14岁的患有自闭症的儿子雅各布哈4大签约动态!篮网官宣签约,季后赛名单出炉,骑士再添内线季后赛开战在即,各支队伍也在调整最后的名单,过去这一天有4支队伍爆出了签约动态,小瓜集中给各位领导汇报一下,具体如下关于爵士据著名记者woj的报道爵士计划将后卫特伦特弗雷斯特的双向刘玉民后冬奥时代提供更高水平的规划管理服务提升人民幸福感4月8日,作为突出贡献的集体代表,北京冬奥组委规划建设部部长刘玉民参加了北京冬奥会冬残奥会总结表彰大会。他表示,能够在现场聆听总书记的重要讲话,感到非常激动和自豪。刘玉民是一位名副CBA四强出炉!8进4全部横扫,半决赛对阵辽粤大战沪厦对决4月10日,CBA季后赛四强以及半决赛对阵正式出炉,上半区辽篮VS广东下半区广厦VS上海在季后赛第二轮8进4中,4组对决全部都是20横扫,被淘汰出局的球队是山西浙江吉林和深圳。辽篮别致的白色T恤搭配牛仔裤,帅气又利落你喜欢吗?别致的白色T恤搭配牛仔裤,帅气又利落我喜欢。美女戴着贝雷帽子,时髦又显高,帽檐比较宽,可以阻挡阳光的直接照射,起到一定的防晒作用,她戴着黑色的立体口罩,可以修饰脸型,还给人一种神秘女性这4处毛发旺盛,好还是不好?可能跟你想得不一样女性朋友在日常应该合理的调理身体素质,尤其关于内分泌方面,毕竟男性的抵抗要比女性更强,综合寿命分析,女性的平均寿命高于男性,其中含有很多的因素,比如生活习惯和日常饮食,男生喜欢大口这6种食物没有保质期,即使存放很久也能吃,别傻傻丢掉了导语现在社会中,大家越来越注重养生,尤其日常的饮食,讲究食材的新鲜,大家购买食物的时候会挑选一些新鲜类的食物,而且食物都会有一定的保质期,只有注明保质期限之内大家才能够放心食用。但吃得少,活得久?饭量越小,衰老速度越慢吗?不妨来看一下如今生活条件随之变好,很多人对于养生的意识增强,希望通过这种方法能够使生命得到了延长,听到朋友说吃得少,活得久,饭量越小说明衰老的速度就更慢,这种说法引起了很多养生人士的关注!真相清明后,上热下寒体质人群注意了,记得做好4件事,补足你的气血总上火,一定真有火吗?有这么一种体质,叫上热下寒。咋回事呢?上热下寒的人,常年上火不断。无语的是,这种人上了火要是一个劲清火,各种上火的症状非但没啥起色,很有可能还会越来越严重。但历史解密泰姬为什么不断生孩子?泰姬陵背后的血腥故事据说沙贾汗的宠妃阿姬曼芭奴是一位具有波斯血统的绝世美女,本名亚珠曼德。贝侬。比古姆,性情温柔,擅诗琴书画。印度也是一个拥有数千年历史和文化的国家。印度有一座举世闻名的建筑,那就是泰