美文网首页
Acitiviti6.0与Spring容器集成

Acitiviti6.0与Spring容器集成

作者: 我有一只喵喵 | 来源:发表于2019-03-05 10:46 被阅读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()方法时才会由引擎提供

    相关文章

      网友评论

          本文标题:Acitiviti6.0与Spring容器集成

          本文链接:https://www.haomeiwen.com/subject/vxknuqtx.html