创建ProcessEngine
1.ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()分析
image.png
- 根据flowable.cfg.xml文件配置构造引擎
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="processEngineConfiguration" class="org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:h2:mem:flowable;DB_CLOSE_DELAY=1000" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="jdbcUsername" value="sa" />
<property name="jdbcPassword" value="" />
<property name="databaseSchemaUpdate" value="true" />
<property name="asyncExecutorActivate" value="false" />
<property name="mailServerHost" value="mail.my-corp.com" />
<property name="mailServerPort" value="5025" />
</bean>
</beans>
- 配置XML实际上是一个Spring配置。这并不意味着Flowable只能在Spring环境中使用!我们只是在内部利用Spring的解析和依赖注入功能来构建引擎
ProcessEngineConfiguration分析
- 有多个类可用于定义processEngineConfiguration。这些类表示不同的环境,并相应地设置默认值
- StandaloneProcessEngineConfiguration:流程引擎以独立方式使用,Flowable将负责所有交易
- StandaloneInMemProcessEngineConfiguration:这是一个用于单元测试目的的便利类。Flowable将负责所有交易
- SpringProcessEngineConfiguration:在Spring环境中使用流程引擎时使用
- JtaProcessEngineConfiguration:在引擎以独立模式运行时使用JTA事务
数据库配置
- 定义数据库的JDBC属性:
- dbcUrl:数据库的JDBC URL。
- jdbcDriver:实现特定数据库类型的驱动程序。
- jdbcUsername:用于连接数据库的用户名。
- jdbcPassword:连接数据库的密码
- 基于提供的JDBC属性构造的数据源将具有默认的MyBatis连接池设置
- jdbcMaxActiveConnections:任何时候连接池最多可以包含的活动连接数。默认值为10
- jdbcMaxIdleConnections:任何时候连接池最多可以包含的空闲连接数
- jdbcMaxCheckoutTime:在强制返回连接之前,可以从连接池中检出连接的时间量(以毫秒为单位)。默认值为20000(20秒)
- jdbcMaxWaitTime:这是一个低级别设置,它为池提供了一个机会来打印日志状态,并在它花费异常时间的情况下重新尝试获取连接(以避免在池配置错误时永远无声地失败)默认值是20000(20秒)
在处理大量并发请求时,MyBatis连接池不是最有效或最有弹性的。因此,建议我们使用一个javax.sql.DataSource实现并将其注入流程引擎配置(例如HikariCP,Tomcat JDBC连接池等)
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/flowable" />
<property name="username" value="flowable" />
<property name="password" value="flowable" />
<property name="defaultAutoCommit" value="false" />
</bean>
<bean id="processEngineConfiguration" class="org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
...
- databaseSchemaUpdate:设置策略以在流程引擎启动和关闭时处理数据库模式
- false (默认值):在创建流程引擎时检查库模式的版本,如果版本不匹配则抛出异常
- true:构建流程引擎时,将执行检查,并在必要时执行架构更新。如果架构不存在,则创建它
- create-drop:在创建流程引擎时创建架构,并在关闭流程引擎时删除架构
- 数据库表名称解释
Flowable的数据库名称都以ACT_开头。第二部分是表的用例的双字符标识。此用例也将大致匹配服务API
- ACT_RE_ *:RE代表repository。具有此前缀的表包含静态信息,例如流程定义和流程资源(图像,规则等)
- ACT_RU_ *:RU代表runtime。这些是包含流程实例,用户任务,变量,作业等的运行时数据的运行时表。Flowable仅在流程实例执行期间存储运行时数据,并在流程实例结束时删除记录。这使运行时表保持小而快
- ACT_HI_ *:HI代表history。这些是包含历史数据的表,例如过去的流程实例,变量,任务等
- ACT_GE_ *:general数据,用于各种用例
Job Executor(从6.0.0版开始)
- Flowable v5的异步执行程序是一种在Flowable引擎中执行异步作业的更高性能和更友好的数据库方式
- 如果在Java EE 7下运行,ManagedAsyncJobExecutor则可以使用JSR-236兼容容器来管理线程。为了启用它们,应该在配置中传递线程工厂
作业执行者激活
- AsyncExecutor是一个管理线程池以触发计时器和其他异步任务的组件,其他实现也是可能的(例如,使用消息队列)
- 默认情况下,AsyncExecutor未激活且未启动。通过以下配置,可以与Flowable Engine一起启动异步执行程序
<property name="asyncExecutorActivate" value="true" />
部署缓存配置
所有流程定义都被缓存(在解析之后),以避免每次需要流程定义时都会访问数据库,并且流程定义数据不会更改。默认情况下,此缓存没有限制。要限制流程定义缓存,请添加以下属性:
···
<property name="processDefinitionCacheLimit" value="10" />
···
注入自己的缓存实现。这必须是实现org.flowable.engine.impl.persistence.deploy.DeploymentCache接口的bean:
<property name="processDefinitionCache">
<bean class="org.flowable.MyCache" />
</property>
事件处理程序
- 事件监听器实现
事件监听器的唯一要求是实现org.flowable.engine.delegate.event.FlowableEventListener
public class MyEventListener implements FlowableEventListener {
@Override
public void onEvent(FlowableEvent event) {
if(event.getType() == FlowableEngineEventType.JOB_EXECUTION_SUCCESS) {
System.out.println("A job well done!");
} else if (event.getType() == FlowableEngineEventType.JOB_EXECUTION_FAILURE) {
System.out.println("A job has failed...");
} else {
System.out.println("Event received: " + event.getType());
}
}
//如果事件监听器中的行为不是关键业务,则建议返回false(异常被忽略)
@Override
public boolean isFailOnException() {
// The logic in the onEvent method of this listener is not critical, exceptions
// can be ignored if logging fails...
return false;
}
/**
* 确定此事件侦听器是在事件发生时立即触发还是由getOnTransaction()方法确定的事务生命周期事件触发
* 支持的事务生命周期事件的值包括:COMMITTED,ROLLED_BACK,COMMITTING,ROLLINGBACK
*/
@Override
public boolean isFireOnTransactionLifecycleEvent() {
return false;
}
@Override
public String getOnTransaction() {
return null;
}
}
- org.flowable.engine.delegate.event.BaseEntityEventListener:一个事件侦听器基类,可用于侦听特定类型的实体或所有实体的实体相关事件
- 隐藏掉类型检查,并提供4种方法应覆盖:onCreate(..),onUpdate(..)并onDelete(..)创建实体时,更新或删除。对于所有其他与实体相关的事件,onEntityEvent(..) 调用它