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>
网友评论