ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(IDEA版)springBoot2.0集成activiti

2020-10-26 13:31:52  阅读:548  来源: 互联网

标签:map springBoot2.0 activiti 模型 IDEA import org modelId


1、阅读说明

网络上有很多关于Activiti整合SpringBoot的文章,但是都不全面,按照那些文章的思路整合还得耗时良久,今天抽空写下这篇文章,以帮助大家进行傻瓜式整合,从0到1,完整呈现整合的全过程。

此文章为SpringBoot2整合Activiti6设计器形成基于Activiti6的web项目实例的指导文档,整合工具使用的idea。从零开始,详尽的罗列了每一步整合步骤。需要一定整合者要有一定的技术基础,需要了解maven、springboot、activiti、js前端及h5相关的基础技术。

2、准备资料

  • activiti-6.0.0官方实例:Activiti6的官方代码实例,可从官网下载,也可从我的网盘下载,链接: https://pan.baidu.com/s/1Eh_jrM6nSJ2fEnNSRAmwOQ , 提取码: n822;
  • activiti-5.22.0(官方):Activiti5.22.0的官方代码实例,由于官方从6.0开始就不再提供在线设计器,所以只能使用5.22版本的设计器代码。可从官网下载,也可从我的网盘下载,链接: https://pan.baidu.com/s/138oGBrpCsoTK7MNfU3kUPw , 提取码: wrfi;
  • stencilset.json:Activiti汉化包,网上很多,直接搜索文件名就能找到,也可从我网盘下辖,链接: https://pan.baidu.com/s/1uDNe4R8aXdSXdf10UJJ9lw,提取码: 6q5c;
  • bootstrap-3.3.7-dist.zip:bootstrap的类库,做页面时使用。可从官网下载,也可从我的网盘下载,链接: https://pan.baidu.com/s/1z-_PMPF8vBZCJZQhFlCVAw, 提取码: w6wk。

3、整合过程

3.1、创建数据库

       解压 activiti-6.0.0官方实例 ,根据自己安装的数据库版本选择相应的activiti6数据库创建sql。解压后,sql存放路径:\activiti-6.0.0\database\create。创建完成后,会有28张表,我使用的数据库名称为“actbase”。

3.2、创建一个简单的SpringBoot项目

       此步骤为创建SpringBoot项目,没有什么特殊,若熟悉springboot项目,此步可以略过。

3.3、整合设计器资源代码到项目

由于activiti官方在5.22.0以上版本不再提供在线设计器,所以,我们的在线设计器仍然使用5.22.0版本。并将activiti5.22.0官方示例中的actiti-explorer.war包中的diagram-viewer、editor-app、favicon.ico 放入springboot静态资源目录static中;

将modeler.html(工作流编辑器页面)放到templates目录下;

将汉化文件stencilset.json 放到 resources 目录下;

将bootstrap-3.3.7-dist 类及jquery库放入项目静态资源目录static的js目录下,以备前端页面使用。

整合后台代码:提取activiti-5.22.0\libs\activiti-modeler-5.22.0-sources.jar中的相关代码类,具体目录是:activiti-modeler-5.22.0-sources.jar\org\activiti\rest\editor\model\ModelEditorJsonRestResource.java(此类用于在线编辑器编辑工作流模型)、activiti-modeler-5.22.0-sources.jar\org\activiti\rest\editor\model\ModelSaveRestResource.java(此类用于保存工作流模型)、activiti-modeler-5.22.0-sources.jar\org\activiti\rest\editor\main\StencilsetRestResource.java(此类用于汉化在线编辑器)放到项目中。

     至此,设计器所需的资源与代码整合完毕。

3.4、整合配置文件

  pom.xml文件:主要引入Druid DataSource数据源、mysql、Activiti6.0及xml图形 这4中类库。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8.   <version>2.2.5.RELEASE</version>
  9.   <relativePath/> <!-- lookup parent from repository -->
  10.   </parent>
  11.   <groupId>com.act</groupId>
  12.   <artifactId>act</artifactId>
  13.   <version>0.0.1-SNAPSHOT</version>
  14.   <name>act</name>
  15.   <description>act6-apringboot2 project</description>
  16.    
  17.   <properties>
  18.   <java.version>1.8</java.version>
  19.   <activiti.version>6.0.0</activiti.version>
  20.   <xmlgraphics.version>1.7</xmlgraphics.version>
  21.   <druid.version>1.1.10</druid.version>
  22.   <mysqlconnector.version>5.1.44</mysqlconnector.version>
  23.   </properties>
  24.    
  25.   <dependencies>
  26.   <dependency>
  27.   <groupId>org.springframework.boot</groupId>
  28.   <artifactId>spring-boot-starter-thymeleaf</artifactId>
  29.   </dependency>
  30.   <dependency>
  31.   <groupId>org.springframework.boot</groupId>
  32.   <artifactId>spring-boot-starter-web</artifactId>
  33.   </dependency>
  34.    
  35.   <dependency>
  36.   <groupId>org.springframework.boot</groupId>
  37.   <artifactId>spring-boot-starter-test</artifactId>
  38.   <scope>test</scope>
  39.   <exclusions>
  40.   <exclusion>
  41.   <groupId>org.junit.vintage</groupId>
  42.   <artifactId>junit-vintage-engine</artifactId>
  43.   </exclusion>
  44.   </exclusions>
  45.   </dependency>
  46.    
  47.   <dependency>
  48.   <groupId>org.springframework.boot</groupId>
  49.   <artifactId>spring-boot-starter-security</artifactId>
  50.   </dependency>
  51.    
  52.   <!-- Druid DataSource -->
  53.   <dependency>
  54.   <groupId>com.alibaba</groupId>
  55.   <artifactId>druid-spring-boot-starter</artifactId>
  56.   <version>${druid.version}</version>
  57.   </dependency>
  58.   <!-- mysql -->
  59.   <dependency>
  60.   <groupId>mysql</groupId>
  61.   <artifactId>mysql-connector-java</artifactId>
  62.   <version>${mysqlconnector.version}</version>
  63.   </dependency>
  64.   <!-- Activiti6.0 相关类库 -->
  65.   <dependency>
  66.   <groupId>org.activiti</groupId>
  67.   <artifactId>activiti-spring-boot-starter-basic</artifactId>
  68.   <version>${activiti.version}</version>
  69.   </dependency>
  70.   <dependency>
  71.   <groupId>org.activiti</groupId>
  72.   <artifactId>activiti-json-converter</artifactId>
  73.   <version>${activiti.version}</version>
  74.   <exclusions>
  75.   <exclusion>
  76.   <groupId>org.activiti</groupId>
  77.   <artifactId>activiti-bpmn-model</artifactId>
  78.   </exclusion>
  79.   </exclusions>
  80.   </dependency>
  81.   <!-- xml 图像类库 -->
  82.   <dependency>
  83.   <groupId>org.apache.xmlgraphics</groupId>
  84.   <artifactId>batik-codec</artifactId>
  85.   <version>${xmlgraphics.version}</version>
  86.   </dependency>
  87.   <dependency>
  88.   <groupId>org.apache.xmlgraphics</groupId>
  89.   <artifactId>batik-css</artifactId>
  90.   <version>${xmlgraphics.version}</version>
  91.   </dependency>
  92.   <dependency>
  93.   <groupId>org.apache.xmlgraphics</groupId>
  94.   <artifactId>batik-svg-dom</artifactId>
  95.   <version>${xmlgraphics.version}</version>
  96.   </dependency>
  97.   <dependency>
  98.   <groupId>org.apache.xmlgraphics</groupId>
  99.   <artifactId>batik-svggen</artifactId>
  100.   <version>${xmlgraphics.version}</version>
  101.   </dependency>
  102.   </dependencies>
  103.   <build>
  104.   <plugins>
  105.   <plugin>
  106.   <groupId>org.springframework.boot</groupId>
  107.   <artifactId>spring-boot-maven-plugin</artifactId>
  108.   <configuration>
  109.   <executable>true</executable>
  110.   </configuration>
  111.   </plugin>
  112.   </plugins>
  113.   </build>
  114.    
  115.   </project>

application.yml文件:与普通springboot项目的yml文件基本相同,主要配置数据源及项目名。

  1.   server:
  2.   port: 80
  3.   servlet:
  4.   context-path: /act
  5.   debug: false #设置开发及调试模式
  6.   spring:
  7.   thymeleaf:
  8.   prefix: classpath:/templates/ #thymeleaf 所在路径
  9.   suffix: .html #thymeleaf 后缀
  10.   mode: HTML5 #thymeleaf 采用的标准
  11.   encoding: UTF-8 #thymeleaf 编码格式
  12.   http:
  13.   encoding:
  14.   charset: UTF-8
  15.   mvc:
  16.   date-format: yyyy-MM-dd #时间参数的格式化
  17.   jackson:
  18.   time-zone: GMT+8 #默认为格林尼治时间,设置为北京时间
  19.   date-format: yyyy-MM-dd HH:mm:ss SSS #设置时间的json的格式
  20.   profiles:
  21.   active: loc #指定数据源
  22.   datasource:
  23.   type: com.alibaba.druid.pool.DruidDataSource
  24.   activiti: #activiti rest 配置
  25.   rest-api-enabled: true
  26.   rest-api-servlet-name: activiti-swagger-document
  27.   SpringProcessEngineConfiguration:
  28.   activityFontName: 宋体
  29.   labelFontName: 宋体
  30.   dataSource: datasource
  31.    
  32.   ---
  33.   #数据源
  34.   spring:
  35.   profiles: loc
  36.   datasource:
  37.   url: jdbc:mysql://localhost:3306/actbase?useUnicode=true&characterEncoding=utf-8&useSSL=false
  38.   username: root
  39.   password: 123456

3.5、修改代码

       整合的设计器代码只是能够满足官方设计器的使用,如果要整合成我们自己的web项目进行使用,还得根据自己项目的情况进行部分代码的修改与增加。

  • 加映射:为ModelEditorJsonRestResource.java、ModelSaveRestResource.java(此类用于保存工作流模型)、StencilsetRestResource.java(此类用于汉化在线编辑器)这三个类加入映射访问路径 @RequestMapping("service")。

 

  • 修改ModelSaveRestResource参数:将“@RequestBody MultiValueMap<String, String> values”的传参方式改为单个参数传参。

  • 加入默认工作流文件:系统启动时默认加载工作流文件,建立一个文件放进去即可。

  • 修改app-cfg.js文件:系统启动时默认加载工作流文件,建立一个文件放进去即可。

 

  • 修改modeler.html页面的js路径:根据自己的项目映射名称修改。

3.6、添加工作流控制器

添加工作流控制器ActivitiCtrl用于工作流的增删改查等操作,并与页面对接,作为操作工作流在线设计器的入口。

  1.   package com.act.controller;
  2.    
  3.   import com.fasterxml.jackson.databind.JsonNode;
  4.   import com.fasterxml.jackson.databind.ObjectMapper;
  5.   import com.fasterxml.jackson.databind.node.ObjectNode;
  6.   import org.activiti.bpmn.model.BpmnModel;
  7.   import org.activiti.editor.constants.ModelDataJsonConstants;
  8.   import org.activiti.editor.language.json.converter.BpmnJsonConverter;
  9.   import org.activiti.engine.HistoryService;
  10.   import org.activiti.engine.RepositoryService;
  11.   import org.activiti.engine.RuntimeService;
  12.   import org.activiti.engine.repository.Deployment;
  13.   import org.activiti.engine.repository.Model;
  14.   import org.activiti.engine.runtime.ProcessInstance;
  15.   import org.slf4j.Logger;
  16.   import org.slf4j.LoggerFactory;
  17.   import org.springframework.beans.factory.annotation.Autowired;
  18.   import org.springframework.stereotype.Controller;
  19.   import org.springframework.web.bind.annotation.GetMapping;
  20.   import org.springframework.web.bind.annotation.RequestMapping;
  21.   import org.springframework.web.bind.annotation.ResponseBody;
  22.   import org.springframework.web.servlet.ModelAndView;
  23.    
  24.   import javax.servlet.http.HttpServletResponse;
  25.   import java.io.IOException;
  26.   import java.util.HashMap;
  27.   import java.util.List;
  28.   import java.util.Map;
  29.    
  30.   /**
  31.   * 工作流操作类
  32.   * @author yangyicai
  33.   */
  34.   @Controller
  35.   public class ActititiCtrl {
  36.   //日志
  37.   private static final Logger logger = LoggerFactory.getLogger(ActititiCtrl.class);
  38.   @Autowired
  39.   //流程服务组件:用于流程定义和存取
  40.   private RepositoryService repositoryService;
  41.   @Autowired
  42.   //历史服务组件:用于获取正在运行或已经完成的流程实例的信息
  43.   private HistoryService historyService;
  44.   @Autowired
  45.   //运行时服务组件:提供了启动流程、查询流程实例、设置获取流程实例变量等功能。
  46.   private RuntimeService runtimeService;
  47.   @Autowired
  48.   //数据模型转换
  49.   private ObjectMapper objectMapper;
  50.    
  51.   /**
  52.   * 首页控制器:获取工作流模型列表控制器
  53.   *
  54.   * @param modelAndView 页面对象
  55.   * @return 返回页面对象
  56.   */
  57.   @RequestMapping("/")
  58.   public ModelAndView index(ModelAndView modelAndView) {
  59.   modelAndView.setViewName("index");
  60.   //通过流程服务组件获取当前的工作流模型列表
  61.   List<Model> actList = repositoryService.createModelQuery().list();
  62.   modelAndView.addObject("actList", actList);
  63.   return modelAndView;
  64.   }
  65.    
  66.   /**
  67.   * 跳转编辑器/编辑工作流页面
  68.   *
  69.   * @return
  70.   */
  71.   @GetMapping("/editor")
  72.   public String editor() {
  73.   return "modeler";
  74.   }
  75.    
  76.   /**
  77.   * 创建模型
  78.   *
  79.   * @param response
  80.   */
  81.   @RequestMapping("/create")
  82.   public void create(HttpServletResponse response) throws IOException {
  83.   //创建一个空模型
  84.   Model model = repositoryService.newModel();
  85.    
  86.   //设置一下默认信息
  87.   String modelName = "new-model";//模型名称
  88.   String modelKey = "new-key";// 模型key
  89.   String modelDescription = ""; //模型描述
  90.   int modelVersion = 1; //默认版本号
  91.    
  92.    
  93.   ObjectNode modelNode = objectMapper.createObjectNode();
  94.   modelNode.put(ModelDataJsonConstants.MODEL_NAME, modelName);
  95.   modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, modelDescription);
  96.   modelNode.put(ModelDataJsonConstants.MODEL_REVISION, modelVersion);
  97.   model.setName(modelName);
  98.   model.setKey(modelKey);
  99.   model.setMetaInfo(modelNode.toString());
  100.   repositoryService.saveModel(model);
  101.   createObjectNode(model.getId());
  102.   response.sendRedirect("/act/editor?modelId=" + model.getId());
  103.   logger.info("创建模型结束,返回模型ID:{}", model.getId());
  104.   }
  105.    
  106.   /**
  107.   * 创建模型时完善ModelEditorSource
  108.   *
  109.   * @param modelId
  110.   */
  111.   @SuppressWarnings("/deprecation")
  112.   private void createObjectNode(String modelId) {
  113.   logger.info("创建模型完善ModelEditorSource入参模型ID:{}", modelId);
  114.   ObjectNode editorNode = objectMapper.createObjectNode();
  115.   editorNode.put("id", "canvas");
  116.   editorNode.put("resourceId", "canvas");
  117.   ObjectNode stencilSetNode = objectMapper.createObjectNode();
  118.   stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");
  119.   editorNode.put("stencilset", stencilSetNode);
  120.   try {
  121.   repositoryService.addModelEditorSource(modelId, editorNode.toString().getBytes("utf-8"));
  122.   } catch (Exception e) {
  123.   logger.info("创建模型时完善ModelEditorSource服务异常:{}", e);
  124.   }
  125.   logger.info("创建模型完善ModelEditorSource结束");
  126.   }
  127.    
  128.   /**
  129.   * 发布流程
  130.   *
  131.   * @param modelId 模型ID
  132.   * @return
  133.   */
  134.   @ResponseBody
  135.   @RequestMapping("/publish")
  136.   public Object publish(String modelId) {
  137.   logger.info("流程部署入参modelId:{}", modelId);
  138.   Map<String, String> map = new HashMap<String, String>();
  139.   try {
  140.   Model modelData = repositoryService.getModel(modelId);
  141.   byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
  142.   if (bytes == null) {
  143.   logger.info("部署ID:{}的模型数据为空,请先设计流程并成功保存,再进行发布", modelId);
  144.   map.put("code", "FAILURE");
  145.   return map;
  146.   }
  147.   JsonNode modelNode = new ObjectMapper().readTree(bytes);
  148.   BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
  149.   Deployment deployment = repositoryService.createDeployment()
  150.   .name(modelData.getName())
  151.   .addBpmnModel(modelData.getKey() + ".bpmn20.xml", model)
  152.   .deploy();
  153.   modelData.setDeploymentId(deployment.getId());
  154.   repositoryService.saveModel(modelData);
  155.   map.put("code", "SUCCESS");
  156.   } catch (Exception e) {
  157.   logger.info("部署modelId:{}模型服务异常:{}", modelId, e);
  158.   map.put("code", "FAILURE");
  159.   }
  160.   logger.info("流程部署出参map:{}", map);
  161.   return map;
  162.   }
  163.    
  164.   /**
  165.   * 撤销流程定义
  166.   *
  167.   * @param modelId 模型ID
  168.   * @return
  169.   */
  170.   @ResponseBody
  171.   @RequestMapping("/revokePublish")
  172.   public Object revokePublish(String modelId) {
  173.   logger.info("撤销发布流程入参modelId:{}", modelId);
  174.   Map<String, String> map = new HashMap<String, String>();
  175.   Model modelData = repositoryService.getModel(modelId);
  176.   if (null != modelData) {
  177.   try {
  178.   /**
  179.   * 参数不加true:为普通删除,如果当前规则下有正在执行的流程,则抛异常
  180.   * 参数加true:为级联删除,会删除和当前规则相关的所有信息,包括历史
  181.   */
  182.   repositoryService.deleteDeployment(modelData.getDeploymentId(), true);
  183.   map.put("code", "SUCCESS");
  184.   } catch (Exception e) {
  185.   logger.error("撤销已部署流程服务异常:{}", e);
  186.   map.put("code", "FAILURE");
  187.   }
  188.   }
  189.   logger.info("撤销发布流程出参map:{}", map);
  190.   return map;
  191.   }
  192.    
  193.   /**
  194.   * 删除流程实例
  195.   *
  196.   * @param modelId 模型ID
  197.   * @return
  198.   */
  199.   @ResponseBody
  200.   @RequestMapping("/delete")
  201.   public Object deleteProcessInstance(String modelId) {
  202.   logger.info("删除流程实例入参modelId:{}", modelId);
  203.   Map<String, String> map = new HashMap<String, String>();
  204.   Model modelData = repositoryService.getModel(modelId);
  205.   if (null != modelData) {
  206.   try {
  207.   //先删除流程实例,再删除工作流模型
  208.   ProcessInstance pi = runtimeService.createProcessInstanceQuery().
  209.   processDefinitionKey(modelData.getKey()).singleResult();
  210.   if (null != pi) {
  211.   runtimeService.deleteProcessInstance(pi.getId(), "");
  212.   historyService.deleteHistoricProcessInstance(pi.getId());
  213.   }
  214.   //删除流程模型
  215.   repositoryService.deleteModel(modelId);
  216.   map.put("code", "SUCCESS");
  217.   } catch (Exception e) {
  218.   logger.error("删除流程实例服务异常:{}", e);
  219.   map.put("code", "FAILURE");
  220.   }
  221.   }
  222.   logger.info("删除流程实例出参map:{}", map);
  223.   return map;
  224.   }
  225.   }

3.7、添加工作流操作页面

       该页面(index.html)用于创建、部署、撤销、删除、编辑工作流的测试,此页面使用前端框架bootstrap-3.3.7-dist与模板引擎 Thymeleaf 编写(可根据自己的需求选择前端框架)。用于对接ActititiCtrl控制器。

  1.   <!DOCTYPE html>
  2.   <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
  3.   <head>
  4.   <meta charset="UTF-8">
  5.   <title>工作流模型列表</title>
  6.   <link rel="stylesheet" href="/act/js/bootstrap-3.3.7-dist/bootstrap.min.css">
  7.   <script src="/act/js/jquery-3.4.1.min.js"></script>
  8.   <script src="/act/js/bootstrap-3.3.7-dist/bootstrap.min.js"></script>
  9.   </head>
  10.   <body>
  11.   <div class="panel panel-default" style="margin: 10px" >
  12.   <div class="panel-heading">工作流管理</div>
  13.   <div class="panel-body">
  14.   <a href="/act/create" target="_blank">
  15.   <button type="button" class="btn btn-default" aria-label="Left Align">
  16.   创建模型
  17.   </button>
  18.   </a>
  19.   </div>
  20.   <table class="table">
  21.   <thead>
  22.   <tr>
  23.   <th width="10%">模型编号</th>
  24.   <th width="10%">版本</th>
  25.   <th width="20%">模型key</th>
  26.   <th width="30%">模型名称</th>
  27.   <th width="30%">操作</th>
  28.   </tr>
  29.   </thead>
  30.   <tbody>
  31.   <tr th:each="actModel,actStat:${actList}">
  32.   <th scope="row" th:text="${actModel.id}"></th>
  33.   <td th:text="${actModel.version}"></td>
  34.   <td th:text="${actModel.key}"></td>
  35.   <td th:text="${actModel.name}"></td>
  36.   <td>
  37.   <a th:href="@{'/publish?modelId='+${actModel.id}}" >部署</a>
  38.   <a th:href="@{'/revokePublish?modelId='+${actModel.id}}">撤销</a>
  39.   <a th:href="@{'/editor?modelId='+${actModel.id}}">编辑</a>
  40.   <a th:href="@{'/delete?modelId='+${actModel.id}}">删除</a>
  41.   </td>
  42.   </tr>
  43.   </tbody>
  44.   </table>
  45.   </div>
  46.   </body>
  47.   </html>

4、整合效果展示

工作流列表页

 

创建工作流模型页面

编辑工作流模型页面

 

标签:map,springBoot2.0,activiti,模型,IDEA,import,org,modelId
来源: https://www.cnblogs.com/zhihongming/p/13878017.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有