指点成金-最美分享吧

登录

Flowable用户手册入门学习

佚名 举报

篇首语:本文由小编为大家整理,主要介绍了Flowable用户手册入门学习相关的知识,希望对你有一定的参考价值。

Flowable 中文文档网址:http://www.shareniu.com/flowable6.5_zh_document/bpm/index.html

2.1 Flowable是什么?

Flowable--定义:使用Java编写的轻量级业务流程引擎

  工作流引擎:指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。

    工作流引擎功能包括流程的节点管理流向管理流程样例管理....重要功能

    工作流简介https://blog.csdn.net/shankaipingo/article/details/1387615

  业务流程引擎:

 

  流程定义主要包括两个文件:bpmn文件流程图片

Flowable--功能:1.部署BPMN 2.0流程定义

        2.创建流程定义的流程实例

        3.查询/访问运行中(或历史)的流程实例及相关数据

Flowable--优点:1.可以将JAR形式发布的Flowable库加入应用或服务,来嵌入引擎。

        2.可以使用Flowable REST API进行HTTP调用

        3.提供了可使用简单方便的UI的Flowable应用

2.2 Flowable 是activiti的fork

  activiti是一个著名的工作流引擎(一个工作审批流)。Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),可以定义流程、执行流程并以不同方式对其实现运行。

  activiti运行后生成的一些表:

  

       

 

   关于activiti提供的服务:

 

      1:RepositoryService:Activiti仓库服务类,管理流程定义。(仓库中存储流程定义的两个文件:bpmn文件和流程图片)

      2:RuntimeService:Activiti流程执行服务类,执行(启动/推进/删除...流程实例)管理

      3:TaskService:Activiti任务服务类,跟踪UserTasks,可以使用此服务创建任务、声明并完成任务,分配任务等。

      4:HistoryService:Activiti查询历史信息类

      5:IdentityService:组织机构,管理用户和组

      6:FormService:可选,用于定义中开始表单和任务表单

2.3 构建命令行程序

  2.3.1 创建流程引擎

    创建一个Flowable流程引擎,使用maven获取Flowable依赖及管理构建。

      maven基于项目对象模型(POM),通过对pom.xml文件配置,来管理项目构建,报告和文档的软件项目管理工具

      maven--合理叙述项目间依赖关系

      maven的详细介绍:https://blog.csdn.net/weixin_33853827/article/details/85910940?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

  流程引擎创建:

    1、添加flowable流程引擎和h2数据库两个依赖。pom文件中添加flowable流程引擎依赖时,需要将版本号修改为6.5.0

     
          org.flowable
          flowable-engine
          6.5.0
    

    2、在java的main方法中,创建一个流程引擎

      初始化流程配置--创建流程引擎

      main():ProcessEngine processEngine=creatProcessEngine(creatProcessEngineConfiguration());

      (1)初始化流程配置:使用ProcessEngineConfiguration实例创建一个独立(standlone)的processEngine,所需要的最小配置,是数据库JDBC连接传递参数      

 /**
  * 初始化流程配置中心
  * @return
  */
 public static ProcessEngineConfiguration creatProcessEngineConfiguration () {
  
  ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
  
    .setJdbcUrl("jdbc:h2:mem:flowable;DB_CLOSE_DELAY=-1")
        .setJdbcUsername("sa")
        .setJdbcPassword("")
        .setJdbcDriver("org.h2.Driver")
        .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);

       return cfg;
 }

        --->ProcessEngineConfiguration实例作用:配置与调整流程引擎的设置

        --->独立(standlone)配置对象,?引擎完全独立创建及使用【不是在Spring环境中使用,若在Spring环境中,需要使用SpringProcessEngineConfiguration类】

    (2)这个配置创建ProcessEngine对象

 /**
  * 创建流程引擎实例
  * @param cfg
  * @return
  */
 public static ProcessEngine creatProcessEngineConfiguration (ProcessEngineConfiguration cfg) {
  return cfg.buildProcessEngine();
 }

  2.3.2 部署流程定义

  步骤:流程定义建立(该节采用直接编写BPMN2.0 的xml文件方式,其余方式见下)-部署(deploy)

  1、流程定义的建立:在src/main/resources文件夹下写一个holiday-request.bpmn20.xml文件【xml文件具体内容见官网http://www.shareniu.com/flowable6.5_zh_document/bpm/index.html#_deploying_a_process_definition】  

一些概念:

    *流程定义(process definition):重复执行流程的蓝图

    *流程实例(process instance):某个角色提出的一个流程

    *流程定义需要是BPMN2.0格式,一个流程定义可以启动多个流程实例。例如:请假流程中:流程定义--请假的各个步骤;流程实例--某个雇员提出的一个请假申请

    *BPMN格式存储是一个XML,可以可视化;

    *流程定义建立:使用可视化建模工具,eg:Flowable Designer(Eclipse)或Flowable Web Modeler(Web应用)

官网入门用户手册中流程定义的建立使用方式:直接撰写XML--在src/main/resources文件夹下写一个holiday-request.bpmn20.xml文件

  所建立的流程定义---请假流程:(流程具体解释见用户手册)

   

 

    掌握几个概念:start event--user  task--exclusive gateway

      圆圈:启动事件

      第一个矩形:用户任务,人类用户操作的步骤

      带叉菱形:排他网关

     holiday-request.bpmn20.xml文件中需掌握的几个概念:

      活动(activity)--流程中的每一个步骤;每一个活动都有一个id属性,也可设置一个名字,提高流程图可读性

      顺序流(sequence flow)--一个有向箭头,用于连接活动

      表达式条件(conditionExpression)--在排他网关中使用,当执行到排它网关时,计算表达式条件,使用第一个计算为true的顺序流

      流程变量(process variable)--条件表达式中的变量“approved”.流程变量是持久化数据在特定步骤时设置这个变量,不是流程实例启动时就可以得到的数值

      执行(execution)

  2、部署【将建立好的流程定义部署到Flowable引擎中

   掌握部署流程含义:部署一个流程定义

          ?流程引擎会将XML文件存储在数据库中,在有需要的时候获取它。

          ?流程定义转换为内部的、可执行对象模型,使用它就可以启动流程实例。

 

   步骤:根据xml文件路径的方式在仓库中创建一个新的部署-->执行deploy()部署

 

     从流程引擎对象processEngine对象得到一个仓库服务类(RepositoryService)----使用creatDeployment()在仓库中创建一个部署---使用deploy()方法部署该流程定义(

BPMN2.0.xml)

/**
  * 将流程定义对象,部署到流程引擎的仓库中。
  * @param processEngine
  * @param bpmnFiles
  * @return
  */
 public static Deployment deployFlowableXML(ProcessEngine processEngine,String bpmnFiles) {
  return repositoryService(processEngine).createDeployment().addClasspathResource(bpmnFiles).deploy();
 }

  3、使用API查询流程定义是否已经部署在flowable引擎中--通过RepositoryService创建的ProcessDefinitionQuery对象实现

  2.3.3 启动流程实例

    根据在流程引擎中部署好的流程定义,启动一个流程实例。

    步骤:初始化流程变量--------RuntimeService启动流程实例

    启动流程实例,需要提供一些初始化流程变量(process variable)【呈现给用户的表单/其他系统自动触发流程时通过REST API获取】

      REST:Representational State Transfer 资源表述性转移。REST API介绍:https://blog.csdn.net/champaignwolf/article/details/84099258

    (1)在这部分使用scanner类命令行输入的数据作为初始化的流程变量

    (2)使用Map实例传输数据[Key--用于获取变量的标识符--BPMN2.0 XML文件中id属性]

    (3)使用runtimeservice.startProcessInstanceByKey("holidayRequest", variables)启动流程实例

  2.3.4 事务

      1、数据库事务概念:一个数据库事务通常包含了一个序列的对数据库的读/写操作

      2、数据库事务存在目的:

     (1)为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即时在异常状态仍能保持一致性的方法

     (2)当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

 

   在Flowable中,当一个流程实例运行时,总会有一个数据库事务从前一个等待状态持续到下一个等待状态。引擎到达等待状态的用户任务后,状态持久化到数据库,提交事务,并返回API调用处

       疑问???每次用户任务完成时都会启动一个新的数据库事务?还是一个流程实例只有一个数据库事务??

  2.3.5 查询与完成任务

  本小节功能:查询有几个任务并查看任务列表+任务的完成

  实际应用中,会给角色(雇员/经理)提供登录可查看的任务列表,并决定如何操作任务。本部分通过执行API调用--模拟任务列表

  步骤:【查询】:为用户任务指派办理人,获得任务列表+【完成】

  1、【查询】:获得任务列表-->使用TaskService创建的一个TaskQuery,查询只返回的是‘managers’组的任务

 

  Note:(1)List导入的包是:import java.util.List;(2)task 导入的包是:import org.flowable.task.api.Task;

  结果:

     

   

   

  2、【完成任务】:经理完成任务。--流程变量(process variable)的传递,实现:--带有‘approved’变量的map模拟

   //经理完成任务,使用带有变量‘approved’的map模拟
    boolean approved=scanner.nextLine().toLowerCase().equals("y");
    variables = new HashMap();
    variables.put("approved", approved);
    taskService.complete(task.getId(), variables);

 

   ?输入Yes/no后报错;

 

     原因:没有实现申请通过后执行的自动逻辑---【解决方案】:第2.3.6节实现JavaDelegate

  2.3.6 实现JavaDelegate

  

    解释:在之前的代码中,没有实现申请通过后执行的自动逻辑,即服务任务(service task)【图形结构中带‘设置’图标的那些任务】。BPMN 20.xml文件下有引用类CallExternalSystemDelegate,而我们的项目中目前还没有这个类

 

     

 

  步骤:在org.flowable包下创建CallExternalSystemDelegate类,继承JavaDelegate接口,实现execute()方法

  

 

  公共接口JavaDelegate:

    需要BPMN 2.0流程中的Java委派时应使用的便捷类(例如,调用自定义业务逻辑)。该类可用于服务任务事件侦听器。该类不允许影响控制流。它遵循默认的BPMN 2.0行为,即获取每个输出序列流(如果定义了条件,则条件为true)。如果您需要影响控制流,需使用类"org.flowable.engine .impl.pvm.delegate.ActivityBehavior"代替。

    在该公共接口下,有一个execute()方法。

  2.3.7 使用历史数据--HistoryService

  Flowable功能:自动存储所有流程实例的审计数据历史数据

  步骤:使用引擎获取HistoryService--创建历史活动实例查询(添加过滤条件)

      添加过滤条件:processInstanceId(processInstance.getId()).finished().orderByHistoricActivityInstanceEndTime().asc().list()

        processInstanceId():仅选择具有给定流程实例的历史活动实例,ID与HistoricProcessInstanceID匹配

        finished():仅选择已经完成的历史活动实例

        orderByHistoricActivityInstanceEndTime():按照结束时间排序,需要后跟asc()或desc()

 

  掌握HistoryService使用,getDurationInMillis()方法使用

  运行结果:

  

 

  2.3.8 小结

  1、ProcessEngineConfiguration--可以从中构建流程引擎的配置信息;

      创建processEngine配置对象cfg,使用buildProcessEngine()方法,创建processEngine对象。

   2、ReposityService:提供对流程定义和部署仓库的访问的服务。

          (1)可用于将流程定义部署到流程引擎。使用creatDeployment()[创建一个新的部署]--deploy()方法

  3、ProcessDefinition:一个对象结构,表示由活动和过渡组成的可执行流程。业务流程通常使用图形编辑器创建,这些图形编辑器以某种文件格式存储流程定义。这些文件可以添加到Deployment控件,eg:Business Archive(.bar)文件。在部署时,引擎会将流程定义文件解析为此类的可执行实例。可用于启动一个流程实例

 

             (2)查询流程定义是否在流程引擎。使用repositoryService(processEngine).createProcessDefinitionQuery()[查询流程定义]  

  4、RuntimeService:

      启动流程实例。 使用runtimeService.

      startProcessInstanceByKey()方法:Starts a new process instance in the latest version of the process definition with the given key

  5、TaskService:提供访问任务和表单相关的服务。

      获得任务列表:TaskService创建一个TaskQuery.

      createTaskQuery()--返回一个新的TaskQuery,可用于动态查询任务。

  6、HistoryService:提供正在进行或过去的流程实例的信息的服务。这与运行时信息有所不同,因为该运行时信息在任何给定时刻仅包含实际运行时状态,并且针对运行时过程执行性能进行了优化。历史记录信息经过优化,易于查询,并在永久性存储中永久保留。

      creatHistoricActivityInstanceQuery():创建一个新的程序化查询来搜索HistoricActivityInstances。

 

以上是关于Flowable用户手册入门学习的主要内容,如果未能解决你的问题,请参考以下文章