3.1. 创建ProcessEngine
获取ProcessEngine
,最简单的方式是使用org.flowable.engine.ProcessEngines
类:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()
3.2. ProcessEngineConfiguration bean
这个bean用于构建ProcessEngine
。有多个类可以用于定义processEngineConfiguration
。这些类用于不同的环境,并各自设置一些默认值。最佳实践是选择最匹配你环境的类,以便减少配置引擎需要的参数。目前可以使用的类为:
-
org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration:流程引擎独立运行。Flowable自行处理事务。在默认情况下,数据库检查只在引擎启动时进行(如果Flowable表结构不存在或表结构版本不对,会抛出异常)。
-
org.flowable.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration:这是一个便于使用单元测试的类。Flowable自行处理事务。默认使用H2内存数据库。数据库会在引擎启动时创建,并在引擎关闭时删除。使用这个类时,很可能不需要更多的配置(除了使用任务执行器或邮件等功能时)。
-
org.flowable.spring.SpringProcessEngineConfiguration:在流程引擎处于Spring环境时使用。查看Spring集成章节了解更多信息。
-
org.flowable.engine.impl.cfg.JtaProcessEngineConfiguration:用于引擎独立运行,并使用JTA事务的情况。
3.3. 配置数据库
官网介绍的是xml的配置方式,使用springboot的话,在yml中配置一下数据源就可以了。首次启动项目,系统会自动创建flowable需要的表。我使用的是mysql 8.x版本。
spring:
datasource:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/flowablestudy?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&autoReconnect=true&&zeroDateTimeBehavior=convertToNull&useSSL=true&allowMulQueries=true&&nullCatalogMeansCurrent=true
username: root
password: 123456
3.7. 数据库表名说明
Flowable的所有数据库表都以ACT_开头。第二部分是说明表用途的两字符标示符。服务API的命名也大略符合这个规则。
-
ACT_RE_*: 'RE’代表
repository
。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。 -
ACT_RU_*: 'RU’代表
runtime
。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。 -
ACT_HI_*: 'HI’代表
history
。这些表存储历史数据,例如已完成的流程实例、变量、任务等。 -
ACT_GE_*: 通用数据。在多处使用。
3.18. 事件处理器
Flowable引擎中的事件机制可以让你在引擎中发生多种事件的时候得到通知。查看所有支持的事件类型了解可用的事件。
可以只为特定种类的事件注册监听器,而不是在任何类型的事件发送时都被通知。可以通过配置添加引擎全局的事件监听器,在运行时通过API添加引擎全局的事件监听器,也可以在BPMN XML文件为个别流程定义添加事件监听器。
所有被分发的事件都是org.flowable.engine.common.api.delegate.event.FlowableEvent
的子类。事件(在可用时)提供type
, executionId
, processInstanceId
与processDefinitionId
。部分事件含有关于发生事件的上下文信息。关于事件包含的附加信息,请参阅所有支持的事件类型。
3.18.1. 实现事件监听器
对事件监听器的唯一要求,是要实现org.flowable.engine.delegate.event.FlowableEventListener
接口。下面是一个监听器实现的例子,它将接收的所有事件打印至标准输出,并对作业执行相关的事件特别处理:
public class MyEventListener implements FlowableEventListener {
@Override
public void onEvent(FlowableEvent event) {
switch (event.getType()) {
case JOB_EXECUTION_SUCCESS:
System.out.println("A job well done!");
break;
case JOB_EXECUTION_FAILURE:
System.out.println("A job has failed...");
break;
default:
System.out.println("Event received: " + event.getType());
}
}
@Override
public boolean isFailOnException() {
// onEvent方法中的逻辑并不重要,可以忽略日志失败异常……
return false;
}
}
isFailOnException()
方法决定了当事件分发后,onEvent(..)
方法抛出异常时的行为。若返回false
,忽略异常;若返回true
,异常不会被忽略而会被上抛,使当前执行的命令失败。如果事件是API调用(或其他事务操作,例如作业执行)的一部分,事务将被回滚。如果事件监听器中并不是重要的业务操作,建议返回false
。
Flowable提供了少量基础实现,以简化常用的事件监听器使用场景。它们可以被用作监听器的示例或基类:
-
org.flowable.engine.delegate.event.BaseEntityEventListener: 事件监听器基类,可用来监听实体(entity)相关事件,特定或所有实体的事件都可以。它隐藏了类型检测,提供了4个需要覆盖的方法:
onCreate(..)
,onUpdate(..)
与onDelete(..)
在实体创建、更新及删除时调用;对所有其他实体相关事件,onEntityEvent(..)
会被调用。