Flowable6-整合Spring

ProcessEngineFactoryBean

ProcessEngine 可配置为一个普通的Spring bean. 整合的时候我们需要用到 org.flowable.spring.ProcessEngineFactoryBean 类.

<bean id="processEngineConfiguration" class="org.flowable.spring.SpringProcessEngineConfiguration">
    ...
</bean>

<bean id="processEngine" class="org.flowable.spring.ProcessEngineFactoryBean">
  <property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>

请注意, 这个 processEngineConfigurationbean 现在使用的是org.flowable.spring.SpringProcessEngineConfiguration 类.


Transactions

下面是我们在这个例子中使用的Spring配置文件. 显示的部分包含dataSource, transactionManager, processEngine和Flowable引擎服务.

将DataSource传递给SpringProcessEngineConfiguration时, Flowable在
org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy 内部使用包装传递的DataSource.

这样做是为了确保从DataSource和Spring事务检索到的SQL能够很好地协同工作. 这意味着它不再需要代理的数据源自己可以在Spring中配置.

虽然它仍然可能通过一个 TransactionAwareDataSourceProxy 进入 SpringProcessEngineConfiguration.

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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
                           http://www.springframework.org/schema/context
                             http://www.springframework.org/schema/context/spring-context-2.5.xsd
                           http://www.springframework.org/schema/tx
                             http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

  <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
    <property name="driverClass" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:mem:flowable;DB_CLOSE_DELAY=1000" />
    <property name="username" value="sa" />
    <property name="password" value="" />
  </bean>

  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
  </bean>

  <bean id="processEngineConfiguration" class="org.flowable.spring.SpringProcessEngineConfiguration">
    <property name="dataSource" ref="dataSource" />
    <property name="transactionManager" ref="transactionManager" />
    <property name="databaseSchemaUpdate" value="true" />
    <property name="asyncExecutorActivate" value="false" />
  </bean>

  <bean id="processEngine" class="org.flowable.spring.ProcessEngineFactoryBean">
    <property name="processEngineConfiguration" ref="processEngineConfiguration" />
  </bean>

  <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
  <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
  <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
  <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
  <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />

...

表达式

当使用 ProcessEngineFactoryBean时, 默认情况下, BPMN进程中的所有表达式将看到所有的Spring bean. 可以使用配置映射来限制要在表达式中显示的bean(甚至没有)

<bean id="processEngineConfiguration" class="org.flowable.spring.SpringProcessEngineConfiguration">
  ...
  <property name="beans">
    <map>
      <entry key="printer" value-ref="printer" />
    </map>
  </property>
</bean>

<bean id="printer" class="org.flowable.examples.spring.Printer" />

为了让所有的bean都不暴露, 只需在 SpringProcessEngineConfiguration 上传递一个空的列表作为beans属性. 当没有设置bean属性时, 上下文中的所有Spring bean都将可用.

现在, 可以在表达式中使用暴露的bean: 例如, hello.bpmn20.xml
显示了如何使用UEL方法表达式来调用Spring bean上的方法:

<definitions id="definitions">

  <process id="helloProcess">

    <startEvent id="start" />
    <sequenceFlow id="flow1" sourceRef="start" targetRef="print" />

    <serviceTask id="print" flowable:expression="#{printer.printMessage()}" />
    <sequenceFlow id="flow2" sourceRef="print" targetRef="end" />

    <endEvent id="end" />

  </process>

</definitions>

自动资源部署

Spring集成还具有用于部署资源的特殊功能. 在流程引擎配置中, 您可以指定一组资源. 在创建流程引擎时, 所有这些资源都将被扫描和部署.

有适当的过滤, 防止重复部署. 只有当资源实际发生变化时, 才会重新部署到Flowable DB.

<bean id="processEngineConfiguration" class="org.flowable.spring.SpringProcessEngineConfiguration">
  ...
  <property name="deploymentResources"
    value="classpath*:/org/flowable/spring/test/autodeployment/autodeploy.*.bpmn20.xml" />
</bean>

<bean id="processEngine" class="org.flowable.spring.ProcessEngineFactoryBean">
  <property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>

默认情况下, 上面的配置会将与过滤器匹配的所有资源归入到Flowable引擎的单个部署中. 重复过滤防止重新部署不变的资源适用于整个部署.

在某些情况下, 这可能不是你想要的. 例如, 如果以这种方式部署一组流程资源, 并且这些资源中只有一个流程定义发生了变化, 则整个部署将被视为新的, 并且该部署中的所有流程定义将被重新部署.

为了能够自定义部署方式, 你可以指定一个附加属性SpringProcessEngineConfiguration, deploymentMode. 该属性定义了部署将从匹配过滤器的一组资源中查找. 这个属性默认支持3个值:
default: 将所有资源分组到一个部署中, 并对该部署重复过滤. 这是默认值.

single-resource: 为每个单独的资源创建一个单独的部署, 并对该部署重复过滤. 这时您将每个流程定义分开部署, 并且只有在流程定义版本已更改时才创建新流程定义版本.

resource-parent-folder: 为共享相同父文件夹的资源创建单独的部署, 并对该部署重复过滤. 可以使用此值为大多数资源创建单独的部署,但仍可以通过将其放置在共享文件夹中对其进行分组。以下是如何指定single-resource配置的示例deploymentMode:

<bean id="processEngineConfiguration"
    class="org.flowable.spring.SpringProcessEngineConfiguration">
  ...
  <property name="deploymentResources" value="classpath*:/flowable/*.bpmn" />
  <property name="deploymentMode" value="single-resource" />
</bean>

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 123,280评论 18 134
  • 什么是Spring Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Jav...
    jemmm阅读 15,424评论 1 134
  • application的配置属性。 这些属性是否生效取决于对应的组件是否声明为Spring应用程序上下文里的Bea...
    新签名阅读 4,823评论 1 28
  • 这些属性是否生效取决于对应的组件是否声明为 Spring 应用程序上下文里的 Bean(基本是自动配置的),为一个...
    发光的鱼阅读 1,007评论 0 14
  • 今天晚上对小玥玥进行说教,中间问她,知道吗?懂不懂? 她回答:“知道,懂”。萌翻了。 把我的手机指环扣掰断了,然后...
    简宁思静阅读 62评论 0 0