Acitiviti6.0与Spring容器集成
2019-03-05 本文已影响0人
我有一只喵喵
Acitiviti与Spring容器集成
一、配置ProcessEngineFactooryBean
1、maven依赖
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>6.0.0</version>
</dependency>
2、配置文件详解
- 配置数据源
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/spring_activiti"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</bean>
- activiti引擎采用Mybatis内置的事务管理器,如果使用Spring方式创建引擎,就必须明确指定一个事务管理器
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置注解方式配置事务-->
<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>
- 定义基于Spring的引擎配置对象bean
<!--定义基于Spring的引擎配置对象BEAN-->
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="databaseSchemaUpdate" value="true"/>
<!--<property name="jobExecutorActivate" value="false"/>-->
</bean>
- 配置引擎工厂bean
<!--配置引擎工厂对象BEAN-->
<bean id="processEngineFactory" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration"/>
</bean>
- 配置流程引擎
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration" />
</bean>
- 分别使用Spring提供的工厂方法获取activiti 7个service接口对象
> <!--使用spring提供的工厂方式获取actititi7个service接口对象-->
<bean id="repositoryService" factory-bean="processEngineFactory" factory-method="getRepositoryService"/>
<bean id="runtimeService" factory-bean="processEngineFactory" factory-method="getRuntimeService"/>
<bean id="formService" factory-bean="processEngineFactory" factory-method="getFormService"/>
<bean id="identityService" factory-bean="processEngineFactory" factory-method="getIdentityService"/>
<bean id="historyService" factory-bean="processEngineFactory" factory-method="getHistoryService"/>
<bean id="managementService" factory-bean="processEngineFactory" factory-method="getManagementService"/>
<bean id="taskService" factory-bean="processEngineFactory" factory-method="getTaskService"/>
二、自动部署流程定义
自动部署是通过Spring方式创建流程引擎的一个独有功能,可以在初始化引擎时自动把定义的资源部署到引擎重。部署的方式时利用Spring提供的Resource功能实现的
1、配置容器启动自动部署流程定义文件
<!--定义基于Spring的引擎配置对象BEAN-->
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="databaseSchemaUpdate" value="true"/>
<property name="deploymentResources" value="classpath:*.bpmn20.xml"/>
</bean>
2、配置自动部署过滤重复资源拦截器的工作方式
然而如果每次spring容器重启则都会重新部署这些资源文件,而在spring自动部署时会经过一个过滤重复文件的拦截器,这里可以通过为SpringProcessEngineConfiguration设置deploymentMode属性来确定在此拦截器中采用何种方式进行过滤。
默认提供了三种工作方式:
-
default
将所有资源分组到一个部署中,并对该部署应用重复过滤。这是默认值,如果不指定值,将使用它。 -
single-resource
为每个单独的资源创建一个单独的部署,并对该部署应用重复过滤。这是您将用于单独部署每个流程定义的值,并且只有在流程定义版本发生更改时才创建新的流程定义版本。 -
resource-parent-folder
为共享相同父文件夹的资源创建单独的部署,并对该部署应用重复过滤。此值可用于为大多数资源创建单独的部署,但仍然可以通过将某些资源放在共享文件夹中对它们进行分组
<bean id="processEngineConfiguration"
class="org.activiti.spring.SpringProcessEngineConfiguration">
...
<property name="deploymentResources" value="classpath*:/activiti/*.bpmn" />
<property name="deploymentMode" value="single-resource" />
</bean>
如果上述属性的作用还不满足与当前的业务,那么我们可以自定义来进行控制。
通过继承SpringProcessEngineConfiguration覆写getAutoDeploymentStrategy(String deploymentMode)。
三、表达式
在activiti重表达式应用非常广泛,通过表达式可以动态计算(读取)一切可以计算的表达式,从而动态获得动态值。例如可以通过设置用户任务的办理人,执行一个java service任务,或者执行Execution监听器、task监听器、排他分支的输出流的条件判断等
在acitciti中,所有表达式中出现的变量需要实现序列化接口
1、UEL表达式应用示例
表达式 | 表达式含义 |
---|---|
${myVar} | 获取变量名称为myVar的变量值 |
${myVar.name} | 从变量myVar中读取name属性 |
$(serviceBean.confirm()) | 执行变量名称为serviceBean的confirm方法 |
$(serviceBean.confirm('aaaa')) | 执行变量名称为serviceBean的confirm方法,并且传递了参数,这里的参数可以继续使用URL表达式方式获取,比如$(serviceBean.confirm(param)) |
$(serviceBean.confirm(name,execution)) | 执行变量名称为serviceBean的confirm方法,这里传递的参数为引擎内置变量 |
默认的,spring中的所有bean对于所有的流程来说都是可见的,那么如果我们只想对流程暴漏部分的bean,或者不对流程暴漏任何的bean该如何做呢?在表达式中获取bean实质上是通过ProcessEngineConfiguration中beans属性(map结构)来获取。
所以可以通过为processEngineConfigurantion配置beans属性,然后为beans这个map结构中添加bean或者不添加实现上述特性。
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
...
<property name="beans">
<map>
<entry key="printer" value-ref="printer" />
</map>
</property>
</bean>
<bean id="printer" class="org.activiti.examples.spring.Printer" />
2、引擎内置3变量
变量名称 | 变量含义 |
---|---|
execution | 此变量在运行阶段总是可以调用,对应的接口:org.activiti.engine.delegate.DelegateExecution |
task | execution可以在整个运行期的所有活动上调用,但是task仅仅支持用户任务(UserTask),而且限定为expression类型的表达式 |
authenticatedUserId | 此变量仅在启动流程实例前调用IdentityService的setAuthenticatedUserId()方法时才会由引擎提供 |