• Activiti工作流入门


    1.创建activiti项目

    2.导包+配置文件

    1. <properties>
    2. <slf4j.version>1.6.6slf4j.version>
    3. <log4j.versoin>1.2.12log4j.versoin>
    4. <activiti.version>7.0.0.Beta1activiti.version>
    5. properties>
    6. <dependencies>
    7. <dependency>
    8. <groupId>org.activitigroupId>
    9. <artifactId>activiti-engineartifactId>
    10. <version>${activiti.version}version>
    11. dependency>
    12. <dependency>
    13. <groupId>org.activitigroupId>
    14. <artifactId>activiti-springartifactId>
    15. <version>${activiti.version}version>
    16. dependency>
    17. <dependency>
    18. <groupId>org.activitigroupId>
    19. <artifactId>activiti-bpmn-modelartifactId>
    20. <version>${activiti.version}version>
    21. dependency>
    22. <dependency>
    23. <groupId>org.activitigroupId>
    24. <artifactId>activiti-bpmn-converterartifactId>
    25. <version>${activiti.version}version>
    26. dependency>
    27. <dependency>
    28. <groupId>org.activitigroupId>
    29. <artifactId>activiti-json-converterartifactId>
    30. <version>${activiti.version}version>
    31. dependency>
    32. <dependency>
    33. <groupId>org.activitigroupId>
    34. <artifactId>activiti-bpmn-layoutartifactId>
    35. <version>${activiti.version}version>
    36. dependency>
    37. <dependency>
    38. <groupId>org.activiti.cloudgroupId>
    39. <artifactId>activiti-cloud-services-apiartifactId>
    40. <version>${activiti.version}version>
    41. dependency>
    42. <dependency>
    43. <groupId>mysqlgroupId>
    44. <artifactId>mysql-connector-javaartifactId>
    45. <version>5.1.47version>
    46. dependency>
    47. <dependency>
    48. <groupId>org.mybatisgroupId>
    49. <artifactId>mybatisartifactId>
    50. <version>3.4.5version>
    51. dependency>
    52. <dependency>
    53. <groupId>commons-dbcpgroupId>
    54. <artifactId>commons-dbcpartifactId>
    55. <version>1.4version>
    56. dependency>
    57. <dependency>
    58. <groupId>junitgroupId>
    59. <artifactId>junitartifactId>
    60. <version>4.12version>
    61. dependency>
    62. <dependency>
    63. <groupId>log4jgroupId>
    64. <artifactId>log4jartifactId>
    65. <version>${log4j.versoin}version>
    66. dependency>
    67. <dependency>
    68. <groupId>org.slf4jgroupId>
    69. <artifactId>slf4j-apiartifactId>
    70. <version>1.6.6version>
    71. dependency>
    72. <dependency>
    73. <groupId>org.slf4jgroupId>
    74. <artifactId>slf4j-log4j12artifactId>
    75. <version>1.6.6version>
    76. dependency>
    77. <dependency>
    78. <groupId>commons-iogroupId>
    79. <artifactId>commons-ioartifactId>
    80. <version>2.6version>
    81. dependency>
    82. dependencies>

     activiti.cfg.xml

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:context="http://www.springframework.org/schema/context"
    4. xmlns:tx="http://www.springframework.org/schema/tx"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/contex
    8. http://www.springframework.org/schema/context/spring-context.xsd
    9. http://www.springframework.org/schema/tx
    10. http://www.springframework.org/schema/tx/spring-tx.xsd">
    11. <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    12. <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
    13. <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti" />
    14. <property name="jdbcUsername" value="root" />
    15. <property name="jdbcPassword" value="root" />
    16. <property name="databaseSchemaUpdate" value="true"/>
    17. bean>
    18. beans>

    3. 安装bpmn插件

    4.创建mysql的25张表

    1. /**
    2. * 使用activiti提供的默认方式来创建mysql表
    3. */
    4. @Test
    5. public void testCreateDbtable() {
    6. //需使用acti提供的工具类
    7. //getDefaultProcessEngine会默认从resource中读取名为activiti.cfg.xml的文件
    8. //创建processEngine时,就会创建mysql的表
    9. /**
    10. * 2种创建方式
    11. */
    12. //默认方式
    13. //ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //工作流引擎创建
    14. //System.out.println(processEngine);
    15. //使用自定义方式
    16. //配置文件的名字可以自定义,bean的名字也可以自定义
    17. ProcessEngineConfiguration processEngineConfigurationFromResource =
    18. ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml", "processEngineConfiguration");
    19. //获取流程引擎
    20. ProcessEngine processEngine = processEngineConfigurationFromResource.buildProcessEngine();
    21. System.out.println(processEngine);
    22. /**
    23. * 通过processEngine创建service
    24. * repositoryService: acti资源管理类:管理控制流程发布和流程定义
    25. * RuntimeService: acti流程运行管理类:获取流程执行信息
    26. * TaskService: acti任务管理类:获取任务信息
    27. * HistoryService: acti历史管理类:查询历史信息
    28. * ManagerService: acti引擎管理类:对Acti引擎管理和功能维护
    29. */
    30. RepositoryService repositoryService = processEngine.getRepositoryService();
    31. }

    5.创建Activiti工作流

    1.定义流程,按照BPMN规范,使用流程定义工具,用流程符号把整个流程描述出来
    2.部署流程,把画好的流程定义文件,加载到数据库中,生成表的数据
    3.启动流程,使用代码操作数据库表中的内容
    5.1流程符号

    各网关详解:排他网关(Exclusive Gateway) | AWS BPMN2 Gateway参考指南

    5.2流程设计器使用

    Activiti-Designr使用:16-入门-使用idea流程设计器设计流程_哔哩哔哩_bilibili

    6.流程定义

    使用designer设计器绘制流程,生成.bpmn和.png

    1.将.bpmn文件拷贝桌面保存,并把原bmpn文件改成.xml后缀,点击右键生成图片

    2.导出桌面png文件

    3.将生成的png放回bpmn包下

    4.把xml后缀改回bpmn

    5.activiti模块简介

    1. package com.xuy.test;
    2. import org.activiti.engine.*;
    3. import org.activiti.engine.history.HistoricActivityInstance;
    4. import org.activiti.engine.history.HistoricActivityInstanceQuery;
    5. import org.activiti.engine.repository.Deployment;
    6. import org.activiti.engine.repository.ProcessDefinition;
    7. import org.activiti.engine.repository.ProcessDefinitionQuery;
    8. import org.activiti.engine.runtime.ProcessInstance;
    9. import org.activiti.engine.task.Task;
    10. import org.apache.commons.io.IOUtils;
    11. import org.junit.Test;
    12. import java.io.File;
    13. import java.io.FileOutputStream;
    14. import java.io.IOException;
    15. import java.io.InputStream;
    16. import java.util.List;
    17. import java.util.zip.ZipInputStream;
    18. public class ActivitiDemo {
    19. /**
    20. * 测试流程部署
    21. */
    22. @Test
    23. public void testDeployment() {
    24. //1.创建ProcessEngine
    25. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    26. //2.获取RepoService
    27. RepositoryService repositoryService = processEngine.getRepositoryService();
    28. //3.使用service进行流程部署,定义一个流程名字,把bpmn和png部署到数据库中
    29. Deployment deploy = repositoryService.createDeployment()
    30. .name("出差申请流程")
    31. .addClasspathResource("bpmn/evection.bpmn")
    32. .addClasspathResource("bpmn/evection.png")
    33. .deploy();
    34. //4.输出部署信息
    35. System.out.println("流程部署id=" + deploy.getId());
    36. System.out.println("流程部署名字=" + deploy.getName());
    37. }
    38. /**
    39. * 启动流程实例
    40. */
    41. @Test
    42. public void testStartProcess() {
    43. //1.创建ProcessEngine
    44. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    45. //2.获取Runtimeservice
    46. RuntimeService runtimeService = processEngine.getRuntimeService();
    47. //3.根据流程定义的id启动流程‘
    48. ProcessInstance instance = runtimeService.startProcessInstanceByKey("myEvection");
    49. //4.输出内容
    50. System.out.println("流程定义id:" + instance.getProcessDefinitionId());
    51. System.out.println("流程实例id:" + instance.getId());
    52. System.out.println("当前活动id:" + instance.getActivityId());
    53. }
    54. /**
    55. * 查询个人待执行任务
    56. */
    57. @Test
    58. public void testFindPersonalTaskList() {
    59. //1.获取流程引擎
    60. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    61. //2.获取taskService
    62. TaskService taskService = processEngine.getTaskService();
    63. //3.根据流程key 和 任务的负责人查询任务
    64. List taskList = taskService.createTaskQuery()
    65. .processDefinitionKey("myEvection") //流程key
    66. .taskAssignee("创建") //要查询的负责人
    67. .list();
    68. //4.输出
    69. for (Task task : taskList) {
    70. System.out.println("流程实例id=" + task.getProcessDefinitionId());
    71. System.out.println("任务id=" + task.getId());
    72. System.out.println("任务负责人=" + task.getAssignee());
    73. System.out.println("任务名称=" + task.getName());
    74. }
    75. }
    76. /**
    77. * 完成个人任务
    78. */
    79. @Test
    80. public void completTask() {
    81. //1.获取流程引擎
    82. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    83. //2.获取taskService
    84. TaskService taskService = processEngine.getTaskService();
    85. //3.根据任务id,完成创建人任务
    86. //获取经理 -myEvection对应的任务
    87. Task task = taskService.createTaskQuery()
    88. .processDefinitionKey("myEvection")
    89. .taskAssignee("经理")
    90. .singleResult(); //只是获取单个任务,要获取所有任务,导出list后完成即可
    91. taskService.complete(task.getId()); //完成经理的任务
    92. //获取总经理 -myEvection对应的任务
    93. Task task2 = taskService.createTaskQuery()
    94. .processDefinitionKey("myEvection")
    95. .taskAssignee("总经理")
    96. .singleResult();
    97. taskService.complete(task2.getId()); //完成总经理的任务
    98. //获取财务 -myEvection对应的任务
    99. Task task3 = taskService.createTaskQuery()
    100. .processDefinitionKey("myEvection")
    101. .taskAssignee("财务")
    102. .singleResult();
    103. taskService.complete(task3.getId()); //完成财务的任务
    104. }
    105. /**
    106. * 使用zip包进行批量部署
    107. */
    108. @Test
    109. public void deployProcessByZip() {
    110. //获取流程引擎
    111. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    112. //获取RepoService
    113. RepositoryService repositoryService = processEngine.getRepositoryService();
    114. //流程部署
    115. //读取资源包文件,构造成inputStream
    116. InputStream inputStream = this.getClass()
    117. .getClassLoader()
    118. .getResourceAsStream("bpmn/evection.zip");
    119. //用inputStream构造ZipInputStream
    120. ZipInputStream zipInputStream = new ZipInputStream(inputStream);
    121. //使用压缩包的流进行流程的部署
    122. Deployment deploy = repositoryService.createDeployment()
    123. .addZipInputStream(zipInputStream)
    124. .deploy();
    125. System.out.println("流程部署的id" + deploy.getId());
    126. System.out.println("流程部署的名称" + deploy.getName());
    127. }
    128. /**
    129. * 查询流程定义
    130. */
    131. @Test
    132. public void queryProcessDefinition() {
    133. //获取流程引擎
    134. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    135. //获取RepoService
    136. RepositoryService repositoryService = processEngine.getRepositoryService();
    137. //获取ProcessDifintionQuery对象
    138. ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
    139. //查询当前所有的流程定义,返回流程定义信息的集合
    140. List definitionList = definitionQuery.processDefinitionKey("myEvection")
    141. .orderByProcessDefinitionVersion()
    142. .desc()
    143. .list();
    144. //输出信息
    145. for (ProcessDefinition processDefinition : definitionList) {
    146. System.out.println("流程定义id=" + processDefinition.getId());
    147. System.out.println("流程定义名称=" + processDefinition.getName());
    148. System.out.println("流程定义key=" + processDefinition.getKey());
    149. System.out.println("流程定义版本=" + processDefinition.getVersion());
    150. System.out.println("流程定义部署id=" + processDefinition.getDeploymentId());
    151. }
    152. }
    153. /**
    154. * 流程删除部署信息
    155. * 当前的流程如果并没有完成,想删除需要使用特殊方式,级联删除
    156. */
    157. @Test
    158. public void deleteDeployment() {
    159. //流程部署id
    160. String deploymentId = "1";
    161. //获取流程引擎
    162. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    163. //获取RepoService
    164. RepositoryService repositoryService = processEngine.getRepositoryService();
    165. //删除流程定义,如果该流程定义已有流程实例启动则删除时出错
    166. //设置true级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,
    167. repositoryService.deleteDeployment(deploymentId);
    168. //级联删除
    169. repositoryService.deleteDeployment(deploymentId, true);
    170. }
    171. /**
    172. * 下载资源
    173. * 方案1:使用activiti提供的api,下载资源文件
    174. * 方案2:自己写代码从数据库下载文件,使用jdbc对blob类型,clob类型的数据读取出来,保存到文件目录
    175. * 解决IO操作:导入 commons-io.jar
    176. */
    177. @Test
    178. public void download() throws IOException {
    179. //1.获取流程引擎
    180. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    181. //2.获取RepoService
    182. RepositoryService repositoryService = processEngine.getRepositoryService();
    183. //3.获取ProcessDefintionQuery对象
    184. ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
    185. ProcessDefinition definition = definitionQuery.processDefinitionKey("myEvection").singleResult();
    186. //4.查询流程定义,获取部署id
    187. String deploymentId = definition.getDeploymentId();
    188. //5.通过repoService,传递部署id参数,读取资源信息(png和bpmn)
    189. //获取png图片流,从流程定义表中,获取png图片的目录和名字,通过部署id和文件名来获取图片的资源
    190. String pngName = definition.getDiagramResourceName();
    191. InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, pngName);
    192. //获取bpmn流
    193. String bpmnName = definition.getResourceName();
    194. InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, bpmnName);
    195. //6.构造outputStream流
    196. File pngFile = new File("dir:/evectionflow.png");
    197. File bpmnFile = new File("dir:/evectionflow.bpmn");
    198. FileOutputStream pngOutputStream = new FileOutputStream(pngFile);
    199. FileOutputStream bpmnOutputStream = new FileOutputStream(bpmnFile);
    200. //7.输入流,输出流转换
    201. IOUtils.copy(pngInput, pngOutputStream);
    202. IOUtils.copy(bpmnInput, bpmnOutputStream);
    203. //8.关闭流
    204. pngOutputStream.close();
    205. bpmnOutputStream.close();
    206. pngInput.close();
    207. bpmnInput.close();
    208. }
    209. /**
    210. * 查看历史签核信息
    211. */
    212. @Test
    213. public void findHistoryInfo() {
    214. //获取流程引擎
    215. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    216. //获取HisService
    217. HistoryService historyService = processEngine.getHistoryService();
    218. //获取actinst表的查询对象
    219. HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
    220. //构建查询条件
    221. instanceQuery.processInstanceId("2501").orderByHistoricActivityInstanceStartTime();
    222. instanceQuery.processDefinitionId("defintionId");
    223. //查询所有内容
    224. List activityInstanceList = instanceQuery.list();
    225. //输出
    226. for (HistoricActivityInstance hi : activityInstanceList) {
    227. System.out.println(hi.getActivityId());
    228. System.out.println(hi.getActivityName());
    229. System.out.println(hi.getProcessDefinitionId());
    230. System.out.println(hi.getProcessInstanceId());
    231. }
    232. }
    233. }

  • 相关阅读:
    【AI视野·今日NLP 自然语言处理论文速览 四十九期】Fri, 6 Oct 2023
    使用java.util.Timer实现定时任务,详解Thread.sleep() in a loop, probably busy-waiting问题
    使用ffmpeg解码音频sdl(push)播放
    【done】剑指 Offer 53 - II:0~n-1中缺失的数字
    Matlab之当前路径与上一级路径的符号使用
    聚星文社怎么下载聚星文社ai工具安装教程
    Lua速成(1)
    【问题记录】防止mimikatz获取到明文密码
    代码随想录二刷day41
    Vulkan并非“灵药“
  • 原文地址:https://blog.csdn.net/xy294636185/article/details/126197788