Flowable工作流实战快速入门(一)

【flowable流程引擎入门】 flowable流程引擎入门 阅读详情
AI摘要

本文介绍了Flowable工作流引擎的基本概念,包括工作流原理、BPMN和Flowable与Activiti的区别。通过一个简单的请假流程示例,展示了Flowable的流程定义、部署、查询、启动、审批及历史信息查询。最后,讨论了Flowable在流程管理中的优势和应用场景。

1. 工作流入门介绍

1.1 什么是工作流?

实际生活中有一些例如办公类流程需要多个环节人员进行审批,以达到对整个工作流程的控制与掌握。为提高效率,借助计算机对业务流程自动化执行管理,而Flowable框架就可以帮助我们进行工作流程进行管理工作。而Flowable可以帮助我们即是业务流程发送了变更,我们的业务流程代码也无需进行更新。

1.2 工作流的原理

如何做到我们在业务流程发生变更后,我们的业务系统代码可以不发生改变?原理如下:
在这里插入图片描述

将业务流程的每个节点读取到数据库中,这样每个节点(包括开始节点和结束节点)就是数据库中的一条记录,当发生业务流程的时候,不断的从业务流程图中读取下一个节点,其实就相当于操作节点对应的数据库记录,这样就实现流程管理和状态字段无关。

1.3 BPM

  • BPM(Business Process Management),即业务流程管理,是一种以规范化的构造端到端的卓越业务流程为中心,以持续的提高组织业务绩效为目的的系统化方法,常见商业管理教育如EMBA、MBA等均将BPM包含在内。
  • 企业流程管理主要是对企业内部改革,改变企业只能管理机构重叠、中间层次多、流程不闭环等,做到机构不重叠、业务不复杂,达到缩短流程周期、节约运作资本、提高企业效益的作用。

1.4 BPMN

BPMN(Business Process Model And Notation),业务流程模型和符号,是由BPMI(Business Process Management Initiative)开发的一套的业务流程建模符号,使用BPMN提供的符号可以创建业务流程。2004年5月发布了BPMN1.0规范。BPMI于2005年9月并入OMG(The Object Management Group,对象管理组织)组织。OMG于2011年1月发布BPMN2.0的最终版本。

1.5 Activiti 还是flowable?

下表是Activiti7 与flowable的相关功能特性对比说明。

对比项\引擎Activiti-7.xFlowable-6.x
商业化√√
路线(Roadmap)云工具型
PVM引擎××
BPMN2引擎√√
CMMN引擎×√
DMN引擎×√(开源版支持不太好)
[建模工具选型√(AngularJS)√(AngularJS)
建模工具内容BPMN2BPMN2/CMMN/DMN
扩展节点(Mule\Http等)×√
Spring Boot√√
Spring Cloud√×
Web控制台√√
Rest接口√√
历史异步归档×√
异步任务全局锁×√
  • Activiti

Activiti在目前来看有点不思进取,核心功能和内核的优化并没有太大进步,着力点全在商业版和云上面,核心只支持BPMN2协议,跟6版本没有什么区别。如果你是一个老的Activiti使用者,并且只是用BPMN2协议,可以选用Activiti(非Cloud版本)。

  • Flowable

Flowable不管是功能层面还是在代码层面来讲,都是这2个中最重的,当初跟Activiti分道扬镳的原因也是因为理念不一样,Flowable更注重其功能性、和性能。在上面表格中,历史异步归档和全局锁都是对性能的极大优化,特别是异步任务这一项,当年在使用Activiti的使用是一个极大的困扰,因为异步任务的吞吐反而会随着实例数的增加而加速恶化。Flowable比较臃肿,它支持了太多的东西,以致于如果想做POC或者Demo,环境搭建这一步都够呛。但是如果你本身就想做一个扩展性强的,性能高的工作流平台(SaaS\PaaS),Flowable是不二的选择。
而且flowable和activiti6是同一个团队开发的,activiti先开发,flowable后开发,所以flowable 算是 activiti6的升级版。

2. flowable入门helloWorld

2.1 导入依赖

首先导入Flowable相关Pom依赖如下所示:

  <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
         <logback.version>1.2.3</logback.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.19</version>
        </dependency>
        <dependency>
            <groupId>org.flowable</groupId>
            <artifactId>flowable-engine</artifactId>
            <version>6.3.0</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-access</artifactId>
            <version>${logback.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${logback.version}</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>${logback.version}</version>
        </dependency>
    </dependencies>

2.2 初始化数据库表结构

新增测试类初始化Flowable数据库表的配置类如下:

  private ProcessEngineConfiguration processEngineConfiguration;

    public DataSource initDataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUrl("jdbc:mysql://1.14.49.145:23306/flowable6?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true");
        dataSource.setUsername("root");
        dataSource.setPassword("Xxxxx");
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setMaxActive(3);
        dataSource.setMinIdle(1);
        return dataSource;
    }


    /**
     * 初始化数据库表34张表
     */
    @Before
    public void initDataBaseTables() {
        processEngineConfiguration = new StandaloneProcessEngineConfiguration();
        processEngineConfiguration.setDataSource(initDataSource());
        processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        processEngineConfiguration.buildProcessEngine();
    }

运行测试类输出如下结果:同时查看Flowable数据库,发现新增了34张表如下所示:
在这里插入图片描述

2.4 flowable表命名规则

Flowable的表都是以ACT_开头。第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。
ACT_RE_:'RE’表示Repository。这个前缀的表包含了流程定义和流程静态资源(图片、规则等等)。
ACT_RU_
:'RU’表示Runtime。这些运行时的表,包含流程实例,任务、变量,异步任务等运行中的数据。Flowable只在流程实例执行过程中保存这些数据,在流程结束时就会删除这些记录。这些运行时表可以一直很小并且速度很快。
ACT_HI_:'HI’表示History。这些表包含历史数据,比如历史流程实例,变量,任务等等。
ACT_GE_
:'GE’表示General。通用数据,用于不同场景下。
ACT_ID_*:'ID’表示Identity。组织结构,包含标识的信息,如用户,用户组,等等。

3. Flowable服务

flowable 默认重要服务体系图如下所示:
在这里插入图片描述

3.1 重要Service类介绍

  • RepositoryService

Flowable的资源管理类,提供了管理和控制流程发布包和流程定义的操作。除了部署定义流程之外,此服务还支持查询引擎的发布包和流程定义。

  • RuntimeService

Flowable的流程运行管理类,可以从这个服务类中获取很多关于流程执行的相关信息。

  • TaskService

Flowable的任务管理类,可以获取当前任务信息。

  • HistoryService

Flowable历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据,比如流程实例启动时间,任务参与者等等。

  • ManagementService

Flowable引擎管理类,提供了Flowable流程引擎管理的管理和维护功能,主要用于Activity系统的日常维护。
下面我们将使用Flowable提供的相关service实现一个简单流程入门。

3.2 定义并流程

Flowable官网给我们提供了一个请假流程图如下所示:
在这里插入图片描述

首先这个流程开启了一个请假流程,此请求会被通过或拒绝,若请求通过,就进入外部系统去通过假期请求并结束整个流程。若请求拒绝就发送拒绝邮件然后结束整个流程。
Flowable支持BPMN2,0,所以整个流程可以用xml进行表示,所以上面的流程图xml定义如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
  xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
  xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
  xmlns:flowable="http://flowable.org/bpmn"
  typeLanguage="http://www.w3.org/2001/XMLSchema"
  expressionLanguage="http://www.w3.org/1999/XPath"
  targetNamespace="http://www.flowable.org/processdef">

  <process id="holidayRequest" name="Holiday Request" isExecutable="true">

    <startEvent id="startEvent"/>
    <sequenceFlow sourceRef="startEvent" targetRef="approveTask"/>

    <userTask id="approveTask" name="Approve or reject request"/>
    <sequenceFlow sourceRef="approveTask" targetRef="decision"/>

    <exclusiveGateway id="decision"/>
    <sequenceFlow sourceRef="decision" targetRef="externalSystemCall">
      <conditionExpression xsi:type="tFormalExpression">
        <![CDATA[
          ${approved}
        ]]>
      </conditionExpression>
    </sequenceFlow>
    <sequenceFlow  sourceRef="decision" targetRef="sendRejectionMail">
      <conditionExpression xsi:type="tFormalExpression">
        <![CDATA[
          ${!approved}
        ]]>
      </conditionExpression>
    </sequenceFlow>

    <serviceTask id="externalSystemCall" name="Enter holidays in external system"
        flowable:class="org.flowable.CallExternalSystemDelegate"/>
    <sequenceFlow sourceRef="externalSystemCall" targetRef="holidayApprovedTask"/>

    <userTask id="holidayApprovedTask" name="Holiday approved"/>
    <sequenceFlow sourceRef="holidayApprovedTask" targetRef="approveEnd"/>

    <serviceTask id="sendRejectionMail" name="Send out rejection email"
        flowable:class="org.flowable.SendRejectionMail"/>
    <sequenceFlow sourceRef="sendRejectionMail" targetRef="rejectEnd"/>

    <endEvent id="approveEnd"/>

    <endEvent id="rejectEnd"/>

  </process>

</definitions>

现在我们可借助于RepositoryService 完成流程部署,首先将上面流程图片与流程XML保存在resource目录下如下所示:
在这里插入图片描述

然后将此流程发布到Flowable引擎代码如下所示:

    /**
     * 部署请假流程
     */
    @Test
    public void deployWorkflow() {
        // 部署流程
        RepositoryService repositoryService = processEngineConfiguration.getRepositoryService();
        // 关联resource下xml文件与图片
        Deployment deployment = repositoryService.createDeployment().addClasspathResource("diagram/holiday-request.png")
                .addClasspathResource("diagram/holiday-request.bpmn20.xml")
                // 命名并部署
                .name("请假流程").category("人事流程管理").key("holiday-request").deploy();
        System.out.println("部署id:" + deployment.getId());
        System.out.println("部署名称:" + deployment.getName());
    }

运行结果如下所示:
在这里插入图片描述

可以在表 act_re_deployment 中 查看到此次流程部署信息入下图所示:
在这里插入图片描述

xml流程定义的内容被解析并将相关信息保存在 act_re_procdef 中如下所示:
在这里插入图片描述

Xml文档与流程图片直接保存在 act_ge_bytearray 中如下所示:
在这里插入图片描述

3.3 查询流程信息

Flowable提供了相关API可以让我们查询流程部署的相关信息,我们同样可借助RepositoryService构建_ProcessDefinitionQuery_ 对象,我们可以通过act_re_deployment 部署id为1的记录关联查询流程定义信息,act_re_deployment 表记录如下所示:
在这里插入图片描述
流程定义表内容如下所示:
在这里插入图片描述

查询代码如下所示:

    /**
     * 查询部署信息与请假流程信息
     */
    @Test
    public void queryDeployWorkflow() {
        // 部署流程
        RepositoryService repositoryService = processEngineConfiguration.getRepositoryService();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .deploymentId("1")
                .singleResult();

        System.out.println("Found process definition : " + processDefinition.getName());
        System.out.println("Found process definition : " + processDefinition.getKey());
        System.out.println("Found process definition : " + processDefinition.getCategory());
        System.out.println("--------------------------------------------------------------");
        Deployment deployment = repositoryService.createDeploymentQuery().deploymentId("1").singleResult();
        System.out.println("Found deployment : " + deployment.getName());
        System.out.println("Found deployment : " + deployment.getCategory());
        System.out.println("Found deployment : " + deployment.getKey());
    }

运行结果如下:
在这里插入图片描述

3.4 删除流程

当定义的流程并发布到Flowable引擎上时,我们使用RepositoryService提供 deleteDeployment 删除流程定义的相关内容信息,具体代码如下:

    /**
     * 删除流程
     */
    @Test
    public void removeWorkflow() {
        RepositoryService repositoryService = processEngineConfiguration.getRepositoryService();
        // 第一个指定删除的流程id信息,第二参数若为true,不管流程是否已经启动都会进行强制删除,一般不推荐使用
        repositoryService.deleteDeployment("1",false);
    }

我们检查相关的三个表act_ge_bytearray、act_re_deployment、act_re_procdef 定义的内容都为空了。需要注意的是 deleteDeployment 方法如果为true,不管流程是否已经启动都会进行强制删除,一般不推荐使用。

4.3 启动流程实例

在上面的代码中我们已经将流程定义并发布到Flowable引擎上了,下面就可以启动定义的流程了,所以我们修改一下流程定义的xml并将流程重新部署发布到Flowable引擎上。
在这里插入图片描述
在这里插入图片描述

具体修改xml内容如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
  xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
  xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI"
  xmlns:flowable="http://flowable.org/bpmn"
  typeLanguage="http://www.w3.org/2001/XMLSchema"
  expressionLanguage="http://www.w3.org/1999/XPath"
  targetNamespace="http://www.flowable.org/processdef">

  <process id="holidayRequest" name="Holiday Request" isExecutable="true">

    <startEvent id="startEvent"/>
    <sequenceFlow sourceRef="startEvent" targetRef="approveTask"/>

    <userTask id="approveTask" name="Approve or reject request" flowable:assignee="zhangsan"/>
    <sequenceFlow sourceRef="approveTask" targetRef="decision"/>

    <exclusiveGateway id="decision"/>
    <sequenceFlow sourceRef="decision" targetRef="externalSystemCall">
      <conditionExpression xsi:type="tFormalExpression">
        <![CDATA[
          ${approved}
        ]]>
      </conditionExpression>
    </sequenceFlow>
    <sequenceFlow  sourceRef="decision" targetRef="sendRejectionMail">
      <conditionExpression xsi:type="tFormalExpression">
        <![CDATA[
          ${!approved}
        ]]>
      </conditionExpression>
    </sequenceFlow>

    <serviceTask id="externalSystemCall" name="Enter holidays in external system"
        flowable:class="org.flowable.CallExternalSystemDelegate"/>
    <sequenceFlow sourceRef="externalSystemCall" targetRef="holidayApprovedTask"/>

    <userTask id="holidayApprovedTask" name="Holiday approved" flowable:assignee="lisi"/>
    <sequenceFlow sourceRef="holidayApprovedTask" targetRef="approveEnd"/>

    <serviceTask id="sendRejectionMail" name="Send out rejection email"
        flowable:class="com.galengao.SendRejectMail"/>
    <sequenceFlow sourceRef="sendRejectionMail" targetRef="rejectEnd"/>

    <endEvent id="approveEnd"/>

    <endEvent id="rejectEnd"/>

  </process>

</definitions>

再次运行发布流程的代码,运行结果如下所示:
在这里插入图片描述

下面我们使用Flowable提供的RuntimeService提供的startProcessInstanceByKey方法开启一个流程实例,此方法可接收流程变量,具体代码如下所示:

    /**
     * 开启一个流程实例
     */
    @Test
    public void startProcessInstance() {
        RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();

        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("employee", "zhangsan");
        variables.put("duration", 5);
        variables.put("description", "go climbing");
        ProcessInstance processInstance =
                // 开启流程实例
                runtimeService.startProcessInstanceByKey("holidayRequest", variables);
        String deploymentId = processInstance.getDeploymentId();
        String activityId = processInstance.getActivityId();
        System.out.println("Deployment Id: "+ deploymentId+" Activity Id: "+ activityId);
    }

运行结果如下:
在这里插入图片描述

此次开启的流程实例可在act_ru_task 表查看如下所示;
在这里插入图片描述

而刚刚我们传入的Map参数保存在了act_ru_variable表中如下所示:
在这里插入图片描述

此次流程节点从开始流转到网关节点,一共经历了2个流程节点,我们可通过act_ru_execution 查看相关信息如下:
在这里插入图片描述

4.4 查询流程

流程任务信息可通过TaskService的createTaskQuery方法进行查询,具体实现代码如下所示:

    /**
     * 查询流程任务
     */
    @Test
    public void queryProcessInstance(){
        TaskService taskService = processEngineConfiguration.getTaskService();
        List<Task> list = taskService.createTaskQuery().processDefinitionKey("holidayRequest")
                .taskAssignee("zhangsan").list();
        for (Task task : list) {
            String processInstanceId = task.getProcessInstanceId();
            String name = task.getName();
            String assignee = task.getAssignee();
            String description = task.getDescription();
            String id = task.getId();
            System.out.println("processInstanceId: "+processInstanceId+" name: "+name+" assignee: "+assignee+" description: "+description+" id: "+id);
        }
    }

输出结果如下所示:
在这里插入图片描述

4.5 同意与拒绝流程

  • 拒绝流程

在流程xml定义文件中我们可以查看到如下内容:
在这里插入图片描述

Flowable提供了JavaDelegate接口,通过此接口可以做额外业务逻辑处理,例如当审批拒绝后实现发送拒绝邮件的逻辑,我们的发送邮件代码可以这样实现:

public class SendRejectMail implements JavaDelegate {

    /**
     * Flowable的触发器
     */
    @Override
    public void execute(DelegateExecution delegateExecution) {
        // TODO 此处省略真实发送邮件逻辑
        System.out.println("发送拒绝邮件通知------");
    }
}

然后再来编写拒绝流程的相关代码如下所示:

    /**
     * 拒绝流程,发送拒绝邮件
     */
    @Test
    public void completeProcessInstanceTask() {
        TaskService taskService = processEngineConfiguration.getTaskService();
        Task task = taskService.createTaskQuery().processDefinitionKey("holidayRequest")
                .taskAssignee("zhangsan").singleResult();
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("approved",false);
        taskService.complete(task.getId(),variables);
    }

运行结果如下所示:
在这里插入图片描述

同意流程与拒绝流程类似,只需要将上面变量Map **variables 的 **approved 设置为true即可。
JavaDelegate 接口是个非常有用的接口,我们可以通过此接口在审批通过或者拒绝时,额外进行相关业务处理。

4.6 查询流程历史信息

选择使用Flowable这样的流程引擎的众多原因之一是,它自动存储所有流程实例的审计数据或历史数据,这对我们进行后续进行工作汇总、报告提供前期的相关数据支持,例如我们想看到流程运行的时长,我们可借助HistoryService实现我们的需求,具体代码如下所示:

    /**
     * 查询流程历史信息
     */
    @Test
    public void queryHistoryProcessInstance(){
        HistoryService historyService = processEngineConfiguration.getHistoryService();
        // 查询流程历史激活信息
        HistoricActivityInstanceQuery activityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
        // 查询结束的流程信息
        List<HistoricActivityInstance> activityInstances = activityInstanceQuery.processDefinitionId("holidayRequest:1:4").finished()
                // 按照流程结束时间倒排查询
                .orderByHistoricActivityInstanceEndTime().desc().list();
        for (HistoricActivityInstance instance : activityInstances) {
            String activityName = instance.getActivityName();
            String activityId = instance.getActivityId();
            Long durationInMillis = instance.getDurationInMillis();
            System.out.println("Activity: " + activityName + " activityId:" + activityId + " durationInMillis:" + durationInMillis);
        }
    }

4. 总结

本文Flowable和BPMN 2.0的概念和术语,同时借助与Flowable 提供的各种Service完成如下内容:

  • 流程定义
  • 流程定义查询
  • 删除流程定义
  • 启动流程实例
  • 查询流程实例
  • 查询流程相关历史信息

后面我们将继续更新Flowable相关内容,敬请期待。

5. 代码仓库

https://gitee.com/codegeekgao/frameworks-learn/tree/master/flowable-element

Flowable第一篇、快速上手(Flowable安装、配置、集成) Flowable是一个轻量级、高效可扩展的工作流和业务流程管理(BPM)引擎,支持在Java应用程序中实现复杂的工作流自动化。Flowable最初是作为Activiti项目的一个分支发展而来的,但它现在已经成为一个独立的开源项目,并在企业级应用中得到了广泛使用 阅读详情

相关推荐

项目联系 Spring Boot + flowable 快速实现工作流

被分配的老师用户执行后流向 【网关】,网关以此检查每个出口,流向符合条件的任务,比如这里老师执行任务时是同意,就流向【校长】节点,等待该任务执行。act_ru_execution:运行时流程执行实例表,记录运行中流程运行的各个分支信息(当没有子流程时,其数据与act_ru_task表数据是一一对应的);act_ru_task:运行时流程任务节点表,存储运行中流程的任务节点信息,重要,常用于查询人员或部门的待办任务时使用;带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。

王不困的博客 1539

Flowable流程入门课程

本课程基于最新版开源工作流Flowable 6.6.0进行讲解。着重讲解Flowable工作流的概念、理论和实战。课程内容包括Flowable的架构、安装部署与配置、工作流应用开发与运行的主要过程、Flowable流程引擎服务及其API、Flowable主要元素如事件/序列流/网关/活动和任务、Flowable表单引擎的安装配置和引擎服务、Flowable表单引擎与Spring的集成、表单定义及部署、表单REST API、 Flowable 身份管理应用、Flowable 建模器应用、Flowable 任务应用和Flowable 管理应用等概念、术语和实战内容,让大家能快速实现基于Flowable的流程应用开发。通过对Flowable官方文档进行了彻底梳理和融汇贯通,并结合实践,整合成13小时15分钟共56节的基础课程,系统、简明地呈现给大家,让大家从开源软件文档冗长耗时、英文晦涩难懂、概念理解困难的困境中解脱出来,从而能快速地将Flowable应用到项目实践中去。课程特色: 案例和代码驱动、概念与实战相结合。

flowable工作流看这一篇就够了(基础篇)

接下来我们构建一个非常简单的请假流程,Flowable引擎需要流程定义为BPMN 2.0格式,这是一个业界广泛接受的XML标准。在Flowable术语中,我们将其称为一个流程定义(process definition)。一个流程定义可以启动多个流程实例(process instance)。流程定义可以看做是重复执行流程的蓝图。在这个例子中,流程定义定义了请假的各个步骤,而一个流程实例对应某个雇员提出的一个请假申请。

qq_38196449的博客 2万+

flowable 流程引擎总结

最近公司使用Flowable开发了自己的OA系统,因此对Flowable的相关内容进行如下总结 一、Flowable 是什么 目前最新版是Flowable 6.4.2(2019年07月26日) 官网地址:https://www.flowable.org/ github地址:https://github.com/flowable Flowable 是一个使用 Java 编写的轻量级业务流程引擎,使用 Apache V2 license 协议开源。2016 年 10 月,Activiti 工作流引.

hellozhxy的博客 2万+

flowable工作流所有业务概念

1.什么是工作流审批 根据本人的理解,就是审批流程管理。 2.什么是flowable 1.官方解释 官方解释如下: Flowable 项目提供了一套核心的开源业务流程引擎,这些引擎紧凑且高效。它们为开发人员、系统管理员和业务用户提供工作流和业务流程管理 (BPM) 平台。 它的核心是一个闪电般快速、久经考验的动态 BPMN 流程引擎,伴随着 DMN 决策表和 CMMN 案例管理引擎,所有这些引擎都是用 Java 编写的。它们是 Apache 2.0 许可的开放源代码,拥有一个承诺社区。 所有引擎都可以嵌入

小鲍侃java 3万+

别再死记硬背Payload了!深入理解Flask/Jinja2 SSTI的Python对象继承链与魔术方法

本文深入解析Flask/Jinja2 SSTI漏洞的底层原理,从Python对象模型出发,详细讲解如何通过魔术方法链实现RCE。文章揭示了Python对象继承链与魔术方法的精妙设计,提供了防御与绕过SSTI漏洞的实用技巧,帮助开发者深入理解漏洞本质并采取有效防护措施。

weixin_42525738的博客 356

java后端flowable工作流快速入门实践

项目中的流程控制(提案的流转)使用的是status字段进行不同状态的区分和转换,其实有更好的方案可以使用。使用工作流可以更好的完成这个过程。

Old_Secretary的博客 3104

VS2022+Qt6保姆级环境配置指南:从插件安装到项目互通全流程

本文提供VS2022与Qt6深度整合的全流程指南,涵盖环境配置、插件安装、项目互通等关键步骤。详细解析编译器版本匹配、跨IDE协作方案及效能优化技巧,帮助开发者高效搭建C++界面设计开发环境,实现软件项目无缝互通。

zero1的博客 733

Flowable 工作流(一)

Flowable工作流介绍,部署

42 1212

MiFlash Prime免授权刷机实战:解锁小米9008 EDL救砖新方案

MiFlash Prime作为免授权刷机工具,有效解决了小米设备在9008 EDL模式下因账号验证无法救砖的难题。本文详细介绍了从驱动安装、进入EDL模式到固件刷写的完整流程,帮助用户安全快速地恢复变砖设备,是维修人员和极客的实用解决方案。

5f4d3s2a1q的博客 2879

Windows系统下LaTeX环境搭建与编辑器配置全攻略

本文详细介绍了在Windows系统下搭建LaTeX环境的完整流程,包括TeX Live的安装、TeXStudio编辑器的配置优化以及常见问题排查。特别针对中文用户推荐使用清华镜像源加速下载,并提供了XeLaTeX编译器配置、中文支持等实用技巧,帮助用户快速上手LaTeX文档编写。

weixin_42554408的博客 449

Flowable:工作流 - 从入门到实战

Flowable:工作流 - 从入门到实战

weixin_46619605的博客 4092

手机抽奖页面代码html,html5大转盘抽奖支持手机转盘抽奖代码

特效描述:html5 大转盘抽奖 支持手机 转盘抽奖代码。html5转盘,html5抽奖,手机转盘,手机抽奖,手机转盘抽奖,可配置奖品抽奖。代码结构1. 引入CSS2. 引入JS3. HTML代码大转盘活动var turnplate={restaraunts:[],//大转盘奖品名称colors:[],//大转盘奖品区块对应背景颜色outsideRadius:192,//大转盘外圆的半径textR...

weixin_39628551的博客 1867

SpringBoot+flowable快速实现工作流

在简单了解flowable后与activiti框架相比的第一感觉就是开发方便快速,易与springBoot等各种框架快速整合。如果项目中需要快速实现一些工作流的相关功能那么用此框架是一个不错的选择。我先给大家简单的对flowable做个介绍吧。Flowable提供了一个组高效的核心开源业务流程引擎,为开发人员,系统管理员和业务用户提供工作流和业务流程管理(BPM)平台。全部用Java编写,并且基于Apache 2.0许可的开源,代码在社区维护。其核心是一个快速,经过试验和测试的动态BPMN流程引擎,附带DM

zhiyikeji的博客 7674

RAP 时代的 Service Binding:把 CDS 业务服务稳稳地“插”到 OData 里

本文深入解析SAP ABAP开发中的关键对象Service Binding,阐述了如何通过三层架构(数据模型、服务定义、服务绑定)实现业务逻辑与协议分离。文章重点分析了Service Binding的核心参数配置,包括服务命名规范、协议类型选择(OData V2/V4、InA、SQL)及服务形态(UI Service与Web API),并通过实际案例说明不同选项的应用场景。同时介绍了服务版本控制机制、发布流程及Fiori预览功能,帮助开发者理解如何通过Service Binding将业务能力高效转化为可消费

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5712

使用Prophet进行时间序列预测

Prophet是Facebook开发的开源时间序列预测工具,用于处理时间序列数据的建模和预测。它建立在统计模型之上,适用于多种时间序列预测问题,具有易用性和灵活性。能够处理缺失值和异常值支持对节假日和季节性的建模可以灵活地添加自定义的季节性成分自动检测变化点提供了直观的可视化工具这个简短的教程为您提供了使用Prophet进行时间序列预测的基本步骤和一些重要的概念。您可以通过阅读Prophet官方文档和其他在线资源来进一步深入学习和了解更多细节。

Mrrunsen的博客 480

【工作流引擎】Flowable快速入门(一) 基础API使用

【工作流引擎】Flowable快速入门(一) 基础API使用 获取ProcessEngine、原生构建、ProcessEngine API、 服务说明、Spring 依赖注入、流程部署、 部署流程定义、流程部署、xml文件和String 部署、BpmnModel 部署、 流程部署查询、流程图片查询、 流程XML查询、 流程删除、流程启动、无参启动、带参数启动、设置流程发起人、运行实例查询、激活或挂起;任务查询、完成,任务评论,任务附件,历史任务查询

Vincent Vic 2881

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

采用springboot+flowable快速实现工作流

前言 工作流框架大家一定不陌生,各种OA系统里我们常常用到。 对于JAVA领域来说一说起工作流框架第一浮现我在脑海中的便是大名鼎鼎的Activiti了。很久以前学习Activiti框架时我也曾记录过一篇文章。见链接:工作流框架Activiti常用功能初探 尽管当时只是学习了一下在之后的相关工作和项目中并没有用到,通过学习后了解了下, 仅对于知识广度进行了扩宽。...

水中加点糖 25万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Flowable工作流:从入门到实战

Flowable是一个开源的轻量级业务流程引擎,支持BPMN 2.0标准,提供完整的流程生命周期管理。文章介绍了Flowable的核心特性(轻量级、高性能、可扩展)和组件(引擎、建模工具、任务管理等),详细讲解了BPMN 2.0基本元素和流程定义XML结构。通过Maven依赖配置和流程引擎初始化代码示例,展示了如何快速搭建Flowable开发环境。该工作流引擎适用于Java应用集成,支持高并发场景和微服务架构。

qq_41262225的博客 1918

Flowable工作流引擎实战指南:从入门到精通

还在为复杂的工作流开发而头疼吗?🤔 Flowable作为一款轻量级、高性能的开源BPMN引擎,能够帮你轻松应对各种业务流程管理需求。今天,我将带你从零开始,用最实用的方式掌握Flowable的核心功能! ## 🚀 快速上手:15分钟搭建第一个工作流 ### 环境准备与项目获取 首先,让我们准备好开发环境: - **Java 8+**:确保你的JDK版本在8以上 - **Maven 3.

gitblog_00319的博客 1085

flowable 中文文档_工作流Flowable

公司要做一个小的工单系统,需要用到工作流引擎,调研了一番,最常用的工作流引擎是Activiti,领导原本想用agile bpm,但是想要组装整合到老项目上比较麻烦,最后选择了flowable,不管是springBoot项目还是spring的老项目,都能比较快速的整合起来。在工作的应用中,以下文章给了很大的帮助,所以放一块分享一下。1.工作流中文文档https://tkjohn.github.io/...

weixin_39682944的博客 2万+

SpringBoot + flowable 快速实现工作流

在程序员工作中,或多或少都会遇见审批流程类型的业务需求。一个审批流程可能包含开始->申请->领导审批->老板审批->结束等多个阶段,如果我们用字段去定义每一个流程阶段(0->开始 1->申请 2->领导审批 3->老板审批 4->结束),虽然可以实现流程运行逻辑,但这样业务代码逻辑复杂。如果审批流程还有驳回操作,则还需要加一个是否驳回字段,显然这样实现,成本太大,且不利于维护。为了解决上述用代码逻辑硬写审批流程而导致的成本大,不利用维护的缺点,工作流因此而生。

m0_73735578的博客 1404

JeecgBoot工作流实战:Flowable流程引擎快速入门指南

还在为复杂的业务流程开发而头疼吗?🚀 今天我要为你介绍JeecgBoot中集成的Flowable流程引擎,这是一款真正能让你"少写代码,多出效果"的神器!作为企业级AI低代码平台,JeecgBoot通过可视化配置让流程开发变得前所未有的简单。 ## 开发痛点与解决方案 **你可能遇到的困境:** - 每个审批流程都要从头写代码,重复劳动让人疲惫 - 流程变更需要修改大量代码,维护成本居高不下

gitblog_01019的博客 870

Flowable工作流快速入门

最近要处理一个oa工作流相关需求,这里记录一下,有完整的代码及相关资源。抛砖引玉,有不对的地方请指教。 本项目里面有两个工作流–报销的工作流和请假的工作流,这里我只演示一个请假的工作流 github资源包括idea插件资源 https://github.com/zhuliangnan/flowable-demo.git 项目目录,其中lib中为两个idea插件资源,因为我用的是最新版的idea插件库里面找不到这个插件所以一并提供。一个是actibpm.jar用于生成bpmn文件,..

qq_37806753的博客 1258

Springboot-Flowable 快速开发工作流

文章目录一、什么是flowable?官方文档:二、技术选型三、Flowable与springBoot项目整合3.1. 添加依赖3.2. yml 文件配置3.3. 创建数据库3.4. 定义流程文件3.5. 测试controller3.6. 图片乱码处理四、启动项目,初始化表结构五、测试验证5.1. 创建一个流程:5.2. 查询待办列表:5.3. 同意:5.4. 生成流程图: 一、什么是flowab...

Gblfy_Blog 3756
上一篇: Spring Security 从入门到精通之获取认证用户信息(四)
下一篇: 初始Hadoop(一)
Galen-gao
博客等级 码龄9年 931粉丝 137原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值