flowable Form Engine 表单引擎

2,329 阅读6分钟

1、配置

1.1、创建一个表单引擎

获取FormEngine的最简单方法是使用org.flowable.form.engine.FormEngines类:

FormEngine formEngine = FormEngines.getDefaultFormEngine()

我们将在 classpath上看到flowable.form.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="formEngineConfiguration" 
  class="org.flowable.form.engine.impl.cfg.StandaloneFormEngineConfiguration">
​
    <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" />
​
  </bean>
​
</beans>

FormEngineConfiguration对象也可以以编程方式使用配置文件创建。

FormEngineConfiguration.
  createFormEngineConfigurationFromResourceDefault();
  createFormEngineConfigurationFromResource(String resource);
  createFormEngineConfigurationFromResource(String resource, String beanName);
  createFormEngineConfigurationFromInputStream(InputStream inputStream);
  createFormEngineConfigurationFromInputStream(InputStream inputStream, String beanName);

也可以不使用配置文件,而基于默认值创建配置 。

FormEngineConfiguration.createStandaloneFormEngineConfiguration();
FormEngineConfiguration.createStandaloneInMemFormEngineConfiguration();

所有这些都是为了FormEngineConfiguration.createXXX()方法返回一个FormEngineConfiguration,如果需要,可以进一步调整该配置。调用buildFormEngine()操作后,将创建一个FormEngine:

FormEngine formEngine = 
FormEngineConfiguration.createStandaloneInMemFormEngineConfiguration()
  .setDatabaseSchemaUpdate(FormEngineConfiguration.DB_SCHEMA_UPDATE_FALSE)
  .setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000")
  .buildFormEngine();

1.2、 FormEngineConfiguration bean

这个flowable.form.cfg.xml必须包含id为“formEngineConfiguration”的bean。

 <bean id="formEngineConfiguration" 
    class="org.flowable.form.engine.impl.cfg.StandaloneFormEngineConfiguration">

然后使用这个bean构造FormEngine。

可用于定义formEngineConfiguration 的类:

  • org.flowable.form.engine.impl.cfg.StandaloneFormEngineConfiguration:以独立方式使用流程引擎。Flowable将负责处理事务。默认情况下,只有在引擎启动时才会检查数据库(如果没有Flowable Form schema或schema版本不正确,则会引发异常)。
  • org.flowable.form.engine.impl.cfg.StandaloneInMemFormEngineConfiguration:这是方便用于单元测试的类。Flowable Form将处理事务。默认情况下使用H2内存数据库。当引擎启动和关闭时,将创建并删除数据库。当使用这个时,可能不需要额外的配置)。
  • org.flowable.form.engine.impl.cfg.StandaloneFormEngineConfiguration:在Spring环境中使用表单引擎时使用。

1.3 插入流程引擎(Plug into Process Engine)

除了在独立模式下运行之外,还可以将表单引擎插入流程引擎。这使流程引擎知晓表单引擎和其他引擎。例如,这使得既包含BPMN模型,又包含DMN模型的构件(artifacts)能够部署到流程引擎的部署服务API中。

若要使流程引擎知晓表单引擎,则需要添加org.flowable.dmn.engine.configurator.FormEngineConfigurator到流程引擎配置中的配置器列表中。此配置器是 flowable-form-engine-configurator模块的一部分。

<bean id="processEngineConfiguration" class="org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration">
​
    <property name="configurators">
      <list>
        <ref bean="formEngineConfigurator" />
      </list>
    </property>
    ...
</bean>
​
<bean id="formEngineConfiguration" class="org.flowable.form.engine.impl.cfg.StandaloneFormEngineConfiguration">
    <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="" />
</bean>
​
<bean id="formEngineConfigurator" class="org.flowable.form.engine.configurator.FormEngineConfigurator">
    <property name="formEngineConfiguration" ref="formEngineConfiguration" />
</bean>

1.4 数据库配置(Database configuration)

有两种方法可以配置Flowable Form引擎将使用的数据库。

第一个方法是定义数据库的JDBC属性:

  • jdbcUrl:数据库的JDBC URL。
  • jdbcDriver:针对特定数据库类型的驱动程序实现。
  • jdbcUsername:连接到数据库的用户名。
  • jdbcPassword:连接到数据库的密码。

基于所提供的JDBC属性构造出的数据源将具有默认MyBatis 连接池设置。可以选择设置以下属性来调整连接池

  • jdbcMaxActiveConnections:在任何时候,连接池可以包含的最大活动连接数。默认值为10。
  • jdbcMaxIdleConnections:在任何时候,连接池可以包含的最大空闲连接数。
  • jdbcMaxCheckoutTime:在强制返回连接之前,可以从连接池“签出”连接的时间量(以毫秒为单位)。默认值为20000(20秒)。
  • jdbcMaxWaitTime:这是一个低级别的设置,它使池有机会打印日志状态,并在需要非正常长时间的情况下重新尝试获取连接(以避免在池配置错误时永远无提示地失败)。默认值为20000(20秒)。

数据库配置示例:

<property name="jdbcUrl" value="jdbc:h2:mem:flowable_dmn;DB_CLOSE_DELAY=1000" />
<property name="jdbcDriver" value="org.h2.Driver" />
<property name="jdbcUsername" value="sa" />
<property name="jdbcPassword" value="" />

第二种方法,我们的基准测试表明,在处理大量并发请求时,MyBatis连接池不是最有效或最有弹性的。因此,我们建议使用javax.sql.DataSource实现,并将其注入流程引擎的配置中

<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_dmn" />
  <property name="username" value="flowable" />
  <property name="password" value="flowable" />
  <property name="defaultAutoCommit" value="false" />
</bean>
​
<bean id="formEngineConfiguration" class="org.flowable.form.engine.impl.cfg.StandaloneFormEngineConfiguration">
​
    <property name="dataSource" ref="dataSource" />
    ...

请注意,Flowable Form不包含允许您定义此类数据源的库。所以你必须确保这些库在你的classpath上。

无论您使用的是JDBC还是数据源方法,都可以设置以下属性:

  • databaseType:通常不需要指定此属性,因为它是从数据库连接元数据自动标识的。仅在自动检测失败时指定。可能值:{h2,mysql,oracle,postgres,mssql,db2}。此设置将确定将使用哪些创建/删除脚本和查询。

  • databaseSchemaUpdate:允许您设置:在表单引擎启动和关闭(boot and shutdown)时处理数据库schema的策略。

    • false(默认):在创建表单引擎时,对照库检查DB schema的版本,如果版本不匹配,则抛出异常。
    • true:在构建表单引擎时,将执行检查并在必要时更新schema。如果schema不存在,则会创建它。
    • create-drop:创建表单引擎时创建schema,关闭流程引擎时删除schema。

2、Flowable表单API(The Flowable Form API)

表单引擎API是与Flowable表单交互的最常用方式。中心起点是FormEngine,可以通过配置部分中描述的几种方法创建它。从FormEngine,您可以获得其他各种服务。FormEngine和services对象是线程安全的,因此可以为整个服务器保留对其中一个对象的引用。

// 将在第一次调用表单引擎时初始化并且生成表单引擎,然后始终返回相同的表单引擎
FormEngine formEngine = FormEngines.getDefaultFormEngine();
​
FormRuleService formRuleService = formEngine.getFormRuleService();
​
// FormRepositoryService服务提供用于管理和操纵部署和表单定义
FormRepositoryService formRepositoryService = formEngine.getFormRepositoryService
​
// FormService 提供用于创建表单实例(包含用户为特定表单定义填充的值)的方法。它还可以用于查询表单实例。
FormService formService = formEngine.getFormService();
​
// 
FormManagementService formManagementService = formEngine.getFormManagementService();

FormEngines.init()和FormEngines.destroy()可以完成所有表单引擎的正确创建和关闭。

FormEngines类将扫描所有flowable.form.cfg.xml和flowable-form-context.xml文件。

对所有flowable.form.cfg.xml文件,表单引擎将以典型的Flowable方式构建

FormEngineConfiguration.createFormEngineConfigurationFromInputStream(inputStream).buildFormEngine()

对于所有flowable-form-context.xml,表单引擎将以Spring方式构建:首先创建Spring应用程序上下文(Spring application context),然后从该应用程序上下文获取表单引擎。

所有服务都是无状态的。这意味着您可以轻松地在集群中的多个节点上运行Flowable Form,每个节点都指向同一个数据库,而不必担心哪个机器实际执行了以前的调用。对任何服务的任何调用都是幂等的,不管它在哪里执行。

FormRepositoryService 可能是使用Flowable表单引擎时需要的第一个服务。此服务提供用于管理和操纵部署和表单定义。表单定义是表单模型的根概念。部署是Flowable表单引擎中的打包单元。一个部署可以包含多个表单定义JSON文件。执行部署意味着它被上传到引擎,在那里所有的表单定义在存储到数据库之前都会被检查和解析。从那时起,系统就知道部署了,现在可以执行部署中包含的任何表单了。 此外,此服务还允许您:

  • 查询引擎已知的表单定义的部署。
  • 检索表单定义的POJO版本,该版本可用于使用Java而不是JSON进行内省(introspect)。

欢迎加入我们:gitee.com/bsin-paas/a…