配置
创建流程引擎
Flowable 流程引擎通过一个名为 flowable.cfg.xml 的 XML 文件配置。请注意,如果你使用的是构建流程引擎的 Spring 方式,则不适用此方式。
获取 ProcessEngine 最简单的方式是使用 org.flowable.engine.ProcessEngines 类:
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine()
这会在 classpath 上查找 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 对象。还可以使用不同的 bean id(例如参见第 3 行)。
ProcessEngineConfiguration.
createProcessEngineConfigurationFromResourceDefault();
createProcessEngineConfigurationFromResource(String resource);
createProcessEngineConfigurationFromResource(String resource, String beanName);
createProcessEngineConfigurationFromInputStream(InputStream inputStream);
createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName);
也可以不使用配置文件,而是基于默认值创建配置(更多信息参见受支持的各类)。
ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
所有这些 ProcessEngineConfiguration.createXXX() 方法都返回一个 ProcessEngineConfiguration,如有需要可以进一步调整。调用 buildProcessEngine() 操作后,即可创建一个 ProcessEngine:
ProcessEngine processEngine = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration()
.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE)
.setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000")
.setAsyncExecutorActivate(false)
.buildProcessEngine();
ProcessEngineConfiguration Bean
flowable.cfg.xml 必须包含一个 id 为 'processEngineConfiguration' 的 bean。
<bean id="processEngineConfiguration" class="org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration">
- org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration:流程引擎以独立方式使用。Flowable 会负责所有事务。默认情况下,数据库仅在引擎启动时检查(如果不存在 Flowable schema 或 schema 版本不正确,则抛出异常)。
- org.flowable.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration:这是一个用于单元测试的便利类。Flowable 会负责所有事务。默认使用 H2 内存数据库。数据库会在引擎启动和关闭时创建和删除。使用此类时,可能不需要额外配置(除非使用作业执行器或邮件功能等)。
- org.flowable.spring.SpringProcessEngineConfiguration:在 Spring 环境中使用流程引擎时使用。更多信息参见 Spring 集成小节。
- org.flowable.engine.impl.cfg.JtaProcessEngineConfiguration:引擎以独立模式运行、使用 JTA 事务时使用。
数据库配置
配置 Flowable 引擎所使用的数据库有两种方式。第一种是定义数据库的 JDBC 属性:
- jdbcUrl:数据库的 JDBC URL。
- jdbcDriver:针对特定数据库类型的驱动实现。
- jdbcUsername:连接数据库的用户名。
- jdbcPassword:连接数据库的密码。
基于所提供 JDBC 属性构建的数据源将使用默认的 MyBatis 连接池设置。可以可选地设置以下属性来调整该连接池(取自 MyBatis 文档):
- jdbcMaxActiveConnections:连接池在任意时刻最多可包含的活动连接数。默认值为 10。
- jdbcMaxIdleConnections:连接池在任意时刻最多可包含的空闲连接数。
- jdbcMaxCheckoutTime:连接从连接池被'检出'后、被强制归还之前的时间(毫秒)。默认值为 20000(20 秒)。
- jdbcMaxWaitTime:这是一个底层设置,当获取连接耗时异常长时,让连接池有机会打印日志状态并重试获取连接(以避免连接池配置错误时永久静默失败)。默认值为 20000(20 秒)。
数据库配置示例:
<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="" />
我们的基准测试表明,MyBatis 连接池在处理大量并发请求时并不是最高效或最有韧性的。因此,建议使用一个 javax.sql.DataSource 实现并将其注入流程引擎配置(例如 HikariCP、Tomcat JDBC Connection Pool 等):
<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" />
...
请注意,Flowable 并不附带定义此类数据源的库。因此你需要确保这些库位于你的 classpath 上。
无论你使用 JDBC 方式还是数据源方式,都可 以设置以下属性:
- databaseType:通常不需要指定此属性,因为它会从数据库连接元数据中自动检测。仅在自动检测失败时才应指定。可能的取值:{h2, mysql, oracle, postgres, mssql, db2}。此设置将决定使用哪些建表/删表脚本和查询。受支持类型的概览参见受支持的数据库小节。
- databaseSchemaUpdate:设置流程引擎启动和关闭时处理数据库 schema 的策略。
- false(默认):创建流程引擎时检查数据库 schema 版本与库是否一致,版本不匹配则抛出异常。
- true:构建流程引擎时进行检查,并在必要时更新 schema。如果 schema 不存在则创建。
- create-drop:创建流程引擎时创建 schema,关闭流程引擎时删除 schema。
JNDI 数据源配置
默认情况下,Flowable 的数据库配置包含在每个 Web 应用 WEB-INF/classes 下的 db.properties 文件中。这并不总是理想的,因为这要求用户要么修改 Flowable 源码中的 db.properties 并重新编译 WAR 文件,要么解包 WAR 并在每次部署时修改 db.properties。
通过使用 JNDI(Java Naming and Directory Interface)获取数据库连接,该连接完全由 Servlet 容器管理,配置可以在 WAR 部署之外管理。这也允许比 db.properties 文件所提供的更精细地控制连接参数。
配置
JNDI 数据源的配置因你所使用的 servlet 容器而异。以下说明适用于 Tomcat,但对于其他容器应用,请参阅你的容器应用文档。
如果使用 Tomcat,JNDI 资源在 $CATALINA_BASE/conf/[enginename]/[hostname]/[warname].xml 中配置(对于 Flowable UI,通常是 $CATALINA_BASE/conf/Catalina/localhost/flowable-app.xml)。默认 context 在应用首次部署时从 Flowable WAR 文件复制,所以如果它已存在,你需要替换它。例如要把 JNDI 资源改为应用连接 MySQL 而非 H2,把文件改为如下内容:
<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/flowable-app">
<Resource auth="Container"
name="jdbc/flowableDB"
type="javax.sql.DataSource"
description="JDBC DataSource"
url="jdbc:mysql://localhost:3306/flowable"
driverClassName="com.mysql.jdbc.Driver"
username="sa"
password=""
defaultAutoCommit="false"
initialSize="5"
maxWait="5000"
maxActive="120"
maxIdle="5"/>
</Context>
JNDI 属性
要配置 JNDI 数据源,请在 Flowable UI 的 properties 文件中使用以下属性:
- spring.datasource.jndi-name=:数据源的 JNDI 名称。
- datasource.jndi.resourceRef:设置是否在 J2EE 容器中进行查找;例如,如果 JNDI 名称尚未包含前缀 "java:comp/env/",则需要添加。默认值为 "true"。
自定义属性
系统属性也可以在 flowable.cfg.xml 中以 $\{propertyName:defaultValue} 的格式使用。
<property name="jdbcUrl" value="${jdbc.url:jdbc:h2:mem:flowable;DB_CLOSE_DELAY=1000}" />
<property name="jdbcDriver" value="${jdbc.driver:org.h2.Driver}" />
<property name="jdbcUsername" value="${jdbc.username:sa}" />
<property name="jdbcPassword" value="${jdbc.password:}" />
使用此配置时,如果属性 jdbc.url 可用,则将用于 ProcessEngineConfiguration 的 jdbcUrl。否则使用第一个 : 之后的值。
也可以通过使用一个 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer 类型的 bean 来定义从系统中读取属性的位置。
带自定义属性位置的配置示例
<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 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="file:/opt/conf/flowable.properties" />
</bean>
<bean id="processEngineConfiguration" class="org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="${jdbc.url:jdbc:h2:mem:flowable;DB_CLOSE_DELAY=1000}" />
<property name="jdbcDriver" value="${jdbc.driver:org.h2.Driver}" />
<property name="jdbcUsername" value="${jdbc.username:sa}" />
<property name="jdbcPassword" value="${jdbc.password:}" />
<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>
使用此配置时,属性将首先在 /opt/conf/flowable.properties 文件中查找。
受支持的数据库
下面列出 Flowable 用于指代数据库的类型(区分大小写!)。
| Flowable 数据库类型 | 示例 JDBC URL | 备注 |
|---|---|---|
| h2 | jdbc:h2:tcp://localhost/flowable |