工作流学习-flowable及activiti相应核心api

265 阅读9分钟

​1.flowable和activiti的异同

微信截图_20240218163920.png

微信截图_20240218163920.png

Flowable 和 Activiti 都是基于 Apache 2.0 许可证的开源工作流和业务流程管理(BPMN 2.0)引擎,它们在设计、功能以及社区支持上有一些区别:

历史和发展:

Activiti:由 Alfresco 公司开发维护,自 2010 年起作为下一代 BPM 引擎推出,其设计理念源自于JBPM项目。

Flowable:最初是由 Activiti 的核心开发团队成员创建的一个分支,由于对 Activiti 发展方向和社区支持等方面的考虑,在2016年左右从 Activiti 分离出来,并以更快的更新速度和更灵活的设计发展。

功能特性与性能:

Activiti:提供了完整的BPMN 2.0标准支持,拥有模型设计器、任务列表、历史服务等功能,且在早期具有较高的市场占有率和知名度。

Flowable:不仅继承了Activiti的基本功能,还增强了微服务架构下的适应性和扩展性。它针对轻量级应用优化了内存占用和启动时间,增加了如动态BPMN、CMMN(案例管理模型与 notation)和DMN(决策模型与notation)的支持,以及更好的事件处理机制等。

社区与生态:

Activiti:作为一个老牌项目,有着庞大的用户群体和丰富的第三方插件集成。

Flowable:虽然起步较晚,但因其持续创新和快速响应社区需求的特点,也迅速积累了大量用户,并形成了活跃的社区和生态系统。

使用场景与扩展性:

Activiti:适用于企业级复杂流程管理系统构建,但在模块扩展和变更方面可能不如Flowable灵活。

Flowable:除了基础的BPM功能外,更加注重轻量化、嵌入式应用场景,更适合现代云原生和微服务架构的需求,它的API设计和内核结构使得开发者更容易进行定制和扩展。

综上所述,选择Flowable还是Activiti主要取决于具体项目需求、技术栈兼容性、对最新特性的依赖程度以及对未来发展的预期。对于新项目或寻求更多灵活性及前沿特性的组织来说,Flowable 可能是一个更具吸引力的选择;而对已有 Activiti 应用场景并希望保持稳定升级的企业,继续关注 Activiti 或根据自身情况评估迁移至 Flowable 的成本收益也是可行的方案。

2.flowable的核心api及作用

apiInter.png

注: 引擎API是与Flowable交互的最常用手段。总入口点是ProcessEngine。像配置(后面文章介绍)章节中介绍的一样,ProcessEngine可以使用多种方式创建。使用ProcessEngine,可以获得各种提供工作流/BPM方法的服务。ProcessEngine与服务对象都是线程安全的,因此可以在服务器中保存并共用同一个引用。

以上核心api可以通过spring自动注入的方式引用,也可通过processEngine获取,具体实现如下。

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​RuntimeService runtimeService = processEngine.getRuntimeService();
​RepositoryService repositoryService = processEngine.getRepositoryService();
​TaskService taskService = processEngine.getTaskService();
​ManagementService managementService = processEngine.getManagementService();
​IdentityService identityService = processEngine.getIdentityService();
​HistoryService historyService = processEngine.getHistoryService();
​FormService formService = processEngine.getFormService();
​DynamicBpmnService dynamicBpmnService = processEngine.getDynamicBpmnService()

processEngineConfiguration :

流程引擎的核心管理类,在Flowable(以及早期的Activiti)中,ProcessEngineConfiguration 类扮演了核心配置角色,它负责创建和初始化 ProcessEngine 实例。ProcessEngine 是流程引擎的核心管理类,而 ProcessEngineConfiguration 则是用来配置这个引擎的行为和组件的

具体来说,ProcessEngineConfiguration 的作用包括但不限于以下几点:

1.数据库连接设置:定义流程引擎使用的数据库类型、JDBC驱动、URL、用户名和密码等信息,用于存储流程定义、运行时数据和其他元数据。

2.事务管理器配置:设定流程引擎内部事务处理方式,例如使用JTA或自定义的事务策略。

3.服务及组件配置:如历史级别(是否记录详细的历史事件)、作业执行器配置(调度异步任务)、身份验证与授权服务等。

4.缓存策略:定义如何缓存流程定义和其他重复查询的数据以提升性能。

5.自定义扩展点:允许用户插入自定义的实现,比如自定义表单引擎、任务监听器、事件监听器等。

6.部署模式:配置流程定义的部署行为,比如是否自动部署资源库中的流程定义文件。

其他引擎参数:比如是否开启多实例并行执行、命令执行超时时间等。

通过一个经过恰当配置的 ProcessEngineConfiguration 对象实例化出来的 ProcessEngine 能够满足特定项目需求,并具备高效稳定地执行和管理业务流程的能力。

processEngine :

*流程引擎实例,这是一个线程安全的对象,因此通常只需要在一个应用中初始化一次。ProcessEngine由ProcessEngineConfiguration实例创建。该实例可以配置与调整流程引擎的设置。通常使用一个配置XML文件创建ProcessEngineConfiguration,但是(像在这里做的一样)也可以编程方式创建它。
*

在ProcessEngines.getDefaultProcessEngine()第一次被调用时,将初始化并构建流程引擎,之后的重复调用都会返回同一个流程引擎。可以通过ProcessEngines.init()创建流程引擎,并由ProcessEngines.destroy()关闭流程引擎。

ProcessEngines会扫描flowable.cfg.xml与flowable-context.xml文件。对于flowable.cfg.xml文件,流程引擎会以标准Flowable方式processEngineConfiguration.createProcessEngineConfigurationFromInputStream(inputStream).buildProcessEngine()。对于flowable-context.xml文件,流程引擎会以Spring的方式构建:首先构建Spring应用上下文,然后从该上下文中获取流程引擎。

所有的服务都是无状态的。这意味着你可以很容易的在集群环境的多个节点上运行Flowable,使用同一个数据库,而不用担心上一次调用实际在哪台机器上执行。不论在哪个节点执行,对任何服务的任何调用都是幂等(idempotent)的。

RepositoryService :

这个服务提供了管理与控制部署(deployments)与流程定义(process definitions)的操作

TaskService **:
**

这个服务提供任务相关的控制,具体如下,可使用在流程的任务节点中的控制

  • 查询分派给用户或组的任务
  • 创建独立运行(standalone) 任务。这是一种没有关联到流程实例的任务
  • 决定任务的执行用户(assignee),或者将用户通过某种方式与任务关联
  • 认领(claim)与完成(complete)任务。认领是指某人决定成为任务的执行用户,也即他将会完成这个任务。完成任务是指“做这个任务要求的工作”,通常是填写某个表单。

QQ截图20240218164840.png

IdentityService :

它用于管理(创建,更新,删除,查询……)组与用户。请注意,Flowable实际上在运行时并不做任何用户检查。例如任务可以分派给任何用户,而引擎并不会验证系统中是否存在该用户。这是因为Flowable有时要与LDAP、Active Directory等服务结合使用。

Ru ****ntimeService:

它用于处理流程实例运行时的各种操作,以下为runtimeService的主要作用

1.启动流程实例:

   ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcessDefinitionKey");

2.查询流程实例:

   ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("instanceId").singleResult();

3.管理流程实例状态:

   // 挂起流程实例   
   runtimeService.suspendProcessInstanceById("instanceId");​   
   // 激活流程实例   
   runtimeService.activateProcessInstanceById("instanceId");​   
   // 删除流程实例   
   runtimeService.deleteProcessInstance("instanceId", "Reason for deletion");

4.获取当前活动任务信息:查询与流程实例关联的当前活动节点(如用户任务)的相关信息

 List<Execution> executions = runtimeService.createExecutionQuery()       .activityId("userTaskActivityId").list();

6.信号发送:向流程实例发送外部信号,触发流程实例中的信号接收器行为。

信号发送:向流程实例发送外部信号,触发流程实例中的信号接收器行为。br

7.跳转到指定活动:改变流程实例的执行路径,使其跳转到另一个指定的活动节点。

总之,RuntimeService 提供了对流程实例生命周期管理和流程执行控制的核心功能支持,使得开发者能够灵活地操控正在运行的流程实例以满足实际业务需求。

**ManagementService:
**

在Activiti(以及Flowable)工作流引擎中,ManagementService 是一个核心服务接口,它主要用于提供对流程引擎管理和维护层面的操作支持。ManagementService 的主要作用包括但不限于以下几点:

1.作业管理:

查询和操作定时任务、异步任务等作业信息,如查询等待执行的作业列表、激活或挂起作业等。清理未完成的任务和死锁。

2.表单数据管理:

获取流程实例相关的表单数据,如启动表单、任务表单的数据。

3.数据库schema操作:

初始化或者更新数据库schema以适应当前流程引擎版本的需求。

4.历史数据清理:

清理历史数据,例如删除过期的历史流程实例、任务以及其他相关的历史记录。

5.引擎及部署信息查询:

查询流程引擎的相关统计信息,比如运行中的流程实例数量、已部署的流程定义数量等。查看和获取已部署的流程定义及其资源文件。

6.命令执行:执行自定义的命令对象,这些命令可以用来直接操作流程引擎内部的状态。

7.事务管理:可能会涉及到与流程实例无关的全局事务操作。

8.其他管理功能:设置流程引擎的全局参数、获取系统属性等高级管理功能。通过 ManagementService ,开发者能够更好地控制和维护工作流引擎,进行必要的运维操作,并且能够在必要时进行深层次的流程实例状态调整或引擎配置变更

HistoryService:

暴露Flowable引擎收集的所有历史数据。当执行流程时,引擎会保存许多数据(可配置),例如流程实例启动时间、谁在执行哪个任务、完成任务花费的事件、每个流程实例的执行路径,等等。这个服务主要提供查询这些数据的能力。

FormService:

是可选服务。也就是说Flowable没有它也能很好地运行,而不必牺牲任何功能。这个服务引入了开始表单(start form)与任务表单(task form)的概念。 开始表单是在流程实例启动前显示的表单,而任务表单是用户完成任务时显示的表单。Flowable可以在BPMN 2.0流程定义中定义这些表单。表单服务通过简单的方式暴露这些数据。再次重申,表单不一定要嵌入流程定义,因此这个服务是可选的。