springBoot整合activiti初次探索

本文的内容主要是基于activiti(5.22)与springBoot集成在线的流程设计器。以及对activiti工作流程的一个初探。

springBoot整合activiti流程设计器demo
先下载demo在来看这篇文章。

文章首发橙寂博客转载请加上谢谢。

如果您需要学习整合activiti建议您下载我的源码我的源码是已经整合好的而且排了坑。我的文章内容不会教你一步步整合,我会讲一些我遇到的一些坑以及解决办法。下载我的源码是可以直接运行的然后访问
http://localhost:8080/act/model/add就可以看到流程设计页面。
建议自己先走一遍在来看文章效果更佳。

activiti概述

activiti是工作流引擎。是由Alfresco软件开源的一个项目。它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。
开发人员可以通过插件直接绘画出业务流程图。ProcessEngine:ProcessEngine对象是activiti的工作流引擎。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。
BPMN:业务流程建模与标注(Business Process Model and Notation,BPMN),描述流程的基本符号,包括这些图元如何组合成一个业务流程图。

这篇文章主要能学到什么

  • 会使用springboot整合一个在线的流程设计器
  • activiti的使用流程
  • 对activiti内置的表结构有一个的理解

接下来我们做一些简单的准备

需要一个在线的流程设计器的war包。官网可以下。activiti官网

mysql数据库。官网下mysql官网

我的整个项目源码springBoot整合activiti流程设计器demo

下载了我的项目源码只需要准备一个mysql数据库就行了。

整合过程我遇到的坑

  • 包冲突问题
    在这次的整合过程中我一开始使用的是springboot默认的starter。发现activiti内置了mybatis包。所以我们需要把activiti内置的mybatis包排除掉
<dependency>
           <groupId>org.activiti</groupId>
           <artifactId>activiti-spring-boot-starter-basic</artifactId>
           <version>${activiti.version}</version>
           <exclusions>
               <exclusion>
                   <groupId>org.mybatis</groupId>
                   <artifactId>mybatis</artifactId>
               </exclusion>
          </exclusions>
</dependency>
  • activiti自带了spring-security每次访问项目会默认让你登录
    这个bug困扰了很久。正是这个bug我放弃了springboot2.0集成的activiti我选择了自己整合。也就是放弃依赖activiti-spring-boot-starter-basic这个包。
<dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>${activiti.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.mybatis</groupId>
                    <artifactId>mybatis</artifactId>
                </exclusion>

            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-modeler</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-diagram-rest</artifactId>
            <version>${activiti.version}</version>
        </dependency>

可以看到这里同样需要去除了mybatis的包。同时我们在启动类上需要排除掉org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class这个自动整合类。

@EnableAutoConfiguration(exclude = {
        org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class
})

核心表结构结构

(Business Process Diagram)数据库:Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。

  • ACT_RE_: 'RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
  • ACT_RU_: 'RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
  • ACT_ID_: 'ID’表示identity。 这些表包含身份信息,比如用户,组等等。
  • ACT_HI_: 'HI’表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
  • ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。 资源库流程规则表:
  • act_re_deployment   部署信息表
  • act_re_model   流程设计模型部署表
  • act_re_procdef   流程定义数据表运行时数据库表:
  • act_ru_execution   运行时流程执行实例表
  • act_ru_identitylink   运行时流程人员表,主要存储任务节点与参与者的相关信息
  • act_ru_task   运行时任务节点表
  • act_ru_variable   运行时流程变量数据表历史数据库表:
  • act_hi_actinst   历史节点表
  • act_hi_attachment   历史附件表
  • act_hi_comment   历史意见表
  • act_hi_identitylink   历史流程人员表
  • act_hi_detail   历史详情表,提供历史变量的查询
  • act_hi_procinst   历史流程实例表
  • act_hi_taskinst   历史任务实例表
  • act_hi_varinst   历史变量表组织机构表:
  • act_id_group   用户组信息表
  • act_id_info   用户扩展信息表
  • act_id_membership   用户与用户组对应信息表
  • act_id_user   用户信息表
    这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足
    通用数据表:
  • act_ge_bytearray   二进制数据表(流程图设计好了会以流的形式存到这张表里)
  • act_ge_property   属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录。

工作流使用流程

坑踩完了开始使用了。在这里大家首先会去认识到哪个步骤需要用哪个业务类去操作。并且这个类的一些操作对应的表会有哪些变化。

  1. 创建并设计模型
    打开页面上的流程设计器进行设计。设计好保存会去调用控制层的保存方法。

这里代码没贴全创建跟保存我是分开的。这个创建出来的是空的,当流程设计完毕后会调用保存方法,我的源码中saveModel这个方法就是保存的。

在这个步骤要做很多事,也是核心。工作流的走向,审批人是谁等等。在这一步就要指定好。

repositoryService这个类主要是用来操作跟模型相关的。

try {
Model model = repositoryService.newModel();
//设置一些默认信息
String name = "new-process";
String description = "";
int revision = 1;
String key = "process";

ObjectNode modelNode = objectMapper.createObjectNode();
modelNode.put(ModelDataJsonConstants.MODEL_NAME, name);
modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);
modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision);

model.setName(name);
model.setKey(key);
model.setMetaInfo(modelNode.toString());

repositoryService.saveModel(model);

创建后act_re_model会多了一条记录

值得一提的是如果工作流对应的其实是一个xml文件,也就是设计出来的最终的效果是一个xml文件。所以部署流程也就是部署这个文件。同个文件可以部署多次。对应的是更新版本。
在我给大家提供的项目中会有下载流程xml文件的接口。exportToXml也就是这个方法把模型id传过去就可以看到了。
2. 部署模型
部署我们根据模型的唯一id去部署

部署也是操作模型所以这里还是使用repositoryService这个类

        //获取模型
        Model modelData = repositoryService.getModel(id);
        byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());

        if (bytes == null) {
            return "fail";
        }
        JsonNode modelNode = null;
        try {
            modelNode = new ObjectMapper().readTree(bytes);
        } catch (IOException e) {
            e.printStackTrace();
            return "fail";
        }
        BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
        if (model.getProcesses().size() == 0) {
            return "fail";
        }
        byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);

        //发布流程
        String processName = modelData.getName() + ".bpmn20.xml";
        Deployment deployment = null;
        try {
            deployment = repositoryService.createDeployment()
                    .name(modelData.getName())
                    .addString(processName, new String(bpmnBytes, "UTF-8"))
                    .deploy();
        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();
            return  "fail";
        }
        modelData.setDeploymentId(deployment.getId());
        repositoryService.saveModel(modelData);

        return "success";

部署后act_re_procdef,act_re_deployment会新增一条数据
act_ge_bytearray(新增两条一个流程文件一个流程图)

  1. 启动流程
    启动流程的时候。这时大家就可以关联自己的业务表了比如请假表等等。在新增请假条的时来启动一个流程。并把businessId关联进去。

runtimeService在运行时操作任务就需要用到这个类。
identityService看名字也知道操作用户或者角色的信息的业务类。

//设置发起者
identityService.setAuthenticatedUserId(id);
// 启动流程 key:要启动的模型的key   businessId:业务的id
ProcessInstance procIns = runtimeService.startProcessInstanceByKey("key","businessId");

启动后act_ru_task会新增一条记录act_hi_actinst会新增两条一个提交一个待审批的记录act_hi_taskinst会新增一条act_hi_procinst会新增一条。act_hi_identitylink会跟据模型生成对应的人员关系

  1. 审批流程
    taskService就是用来对流程任务进行管理,例如任务提醒、任务完成和创建任务等。

审批对应的操作在工作流中会使用到taskService这个类。
在这一步有别的业务就需要调用别的业务类了。

//pass 这个参数 1代表审批通过 0代表审批拒绝 这个使用了排他网关是在流程图定义时做好的。
Map<String,Object> vars = new HashMap<>(16);
		vars.put("pass",  1 );
taskService.complete("37505",vars);

启动act_ru_task会新增一条记录(把原先那个id给删了)act_hi_actinst会新增一条一个待审批的记录act_hi_taskinst会新增一条act_hi_procinst会新增一条。(如果审批完了act_ru_task就没有记录了)

上文中用到了几个核心的service activiti还内置了其他几个service

HistoryService是activiti的查询历史信息的类。

在一个流程执行完成后,这个对象为我们提供查询历史信息。

FormService 一个可选服务,任务表单管理

这个service我目前没有使用到他的功能。等我使用到了我再来补充。
这里有篇博客详解这个service是干嘛的
activiti的FormService的使用

总结

activiti的初探功能,相信看了这篇文章写一个请假流程的demo大家应该是没问题的。我接下来会一直更新这篇文章。跟大家一同探索工作流

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值