Activiti配置

Activiti 专栏收录该内容
2 篇文章 0 订阅

用户的脑洞永远都在碾压我的技术水平,最近又有用户想在流程上大做文章。于是,我只能重翻Activiti 6的用户手册和API,从头记录并分享一下。
Activiti 6的User Guide目录为https://www.activiti.org/userguide/#configuration。
这一篇先介绍Activiti的基本配置。

ProcessEngine的基本配置

流程引擎创建时,虽然可以在代码中直接指定其类型,但一般都是通过加载资源文件、Spring解析来决定其类型。这时,我们需要在对应的资源文件中配置processEngineConfiguration,如下:

<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">

上面的class有三个常用选择,都是ProcessEngineConfigurationImpl的子类:

org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration: 独立流程引擎配置。
org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration: 基于内存的流程引擎配置,设置了默认的jdbcUrl和databaseSchemaUpdate。
org.activiti.spring.SpringProcessEngineConfiguration: Spring的流程引擎配置,重新定义了事务管理器、初始化JPA、设置数据库。

数据库配置

Activiti引擎缺省默认的数据库为H2内存数据库,除此之外,还有有两种配置方式。

  1. 配置JDBC属性,使用MyBatis提供的连接池。但比较简单,不推荐生产环境使用。
    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    	<property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000" />
    	<property name="jdbcDriver" value="org.h2.Driver" />
    	<property name="jdbcUsername" value="sa" />
    	<property name="jdbcPassword" value="" />
    	<property name="databaseSchemaUpdate" value="create-drop" />
    </bean>
    
  2. 配置DataSource,可选第三方实现,这里以Druid为例。
    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    	<property name="dataSource" ref="dataSource"/>
    	<property name="databaseSchemaUpdate" value="create-drop" />
    </bean>
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    	<property name="url" value="jdbc:mysql://localhost:3306/activiti6?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false"/>
    	<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    	<property name="username" value="root"/>
    	<property name="password" value="123456"/>
    	<property name="initialSize" value="1"/>
    	<property name="maxActive" value="10"/>
    	<property name="filters" value="stat,slf4j"/>
    </bean>
    

以上两种方式都有一个重要属性databaseSchemaUpdate,决定流程引擎启动和关闭时数据库表结构的处理策略。有三个值可以选择:

false(默认):流程引擎启动时检查数据库版本,不匹配则抛出异常。(生产环境常用)
true:流程引擎启动时检查并更新,如果不存在则创建。(开发时常用)
create-drop:流程引擎启动时创建表结构,流程引擎关闭时删除表结构。(单元测试常用)

Activiti支持的数据库类型很多,包括h2、mysql、oracle、postgres、db2、mssql。数据库结构的相关脚本,根据具体使用的数据库类型不同,存储在资源文件中,其文件命名规则为:activiti.{db}.{create|drop}.{type}.sql。
所有Activiti的数据库表均以ACT_开头:

ACT_RE_: RE表示repository
ACT_RU_: RU表示runtime
ACT_ID_: ID表示identity
ACT_HI_: HI表示for history
ACT_GE_* GE表示general data

作业执行器配置

一般我们可以通过线程池配置作业执行器。
首先需要开启异步执行:

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
	<property name="asyncExecutorActivate" value="true" />
	<!-- 异步执行器 -->
	<property name="asyncExecutor" ref="asyncExecutor"/>
</bean>

然后配置异步执行器,定义线程池(基于Spring的ThreadPoolExecutorFactoryBean):

<bean id="asyncExecutor"
      class="org.activiti.engine.impl.asyncexecutor.DefaultAsyncJobExecutor">
	<property name="executorService" ref="executorService"/>
</bean>
<bean id="executorService" class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean">
	<property name="threadNamePrefix" value="activiti-job-"/>
	<property name="corePoolSize" value="5"/>
	<property name="maxPoolSize" value="20"/>
	<property name="queueCapacity" value="100"/>
	<property name="rejectedExecutionHandler">
	  <bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/>
	</property>
</bean>
日志记录配置

通过MDC可以将上下文数据存储在ThreadLocal中,可以作为查找问题时的诊断信息输出。流程只有在执行过程中出现异常时,才会记录MDC信息。

  1. Activiti的MDC默认没有开启,需要手动设置:LogMDC.setMDCEnable(true);
  2. 配置Activiti的logback.xml
    <property name="mdc" value="%d{HH:mm:ss.SSS}[%thread][%-5level]%msg  ProcessDefinitionId=%X{mdcProcessDefinitionID}executionId=%X{mdcExecutionId} mdcProcessInstanceID=%X{mdcProcessInstanceID} mdcBusinessKey=%X{mdcBusinessKey} %logger{10}.%M:%L%n" />
    
  3. 日志记录配置分4个级别,

    none: 不保存任何历史数据,性能高,但流程结束后不可读取。
    activity: 保存流程实例、活动实例,但无流程变量。
    audit: 默认值。 保存流程实例、活动实例的基础上,保存了变量值,但不保存变量的改变,保存表单属性。
    full: 最高级别历史记录,性能差。保存所有信息,包括变量的改变。

    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
    	<property name="history" value="audit" />
    </bean>
    
事件处理及监听器配置
  1. 开启关键属性,是否开启事件日志。
    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
    	<property name="enableDatabaseEventLogging" value="true" />
    </bean>
    
  2. 定义一个实现ActivitiEventListener接口的Listener,并在配置文件中配置该监听器。
    public class MyEventListener implements ActivitiEventListener {	
      @Override
      public void onEvent(ActivitiEvent event) {
        switch (event.getType()) {
          case JOB_EXECUTION_SUCCESS:
            System.out.println("A job well done!");
            break;
          case JOB_EXECUTION_FAILURE:
            System.out.println("A job has failed...");
            break;
          default:
            System.out.println("Event received: " + event.getType());
        }
      }
      /**
      	* 如果onEvent(..)事件执行时时抛出异常,则isFailOnException()方法的返回值决定行为。如果false返回,则忽略该异常。当true返回,抛出该异常。如果事件监听器中的行为不是关键业务,建议返回false。
      	*/
      @Override
      public boolean isFailOnException() {
        // The logic in the onEvent method of this listener is not critical, exceptions
        // can be ignored if logging fails...
        return false;
      }
    }
    
    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="eventListeners">
          <list>
             <bean class="org.activiti.engine.example.MyEventListener" />
          </list>
        </property>
    </bean>
    
    还有另一种配置方式,
    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="typedEventListeners">
          <map>
            <entry key="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE" >
              <list>
                <bean class="org.activiti.engine.example.MyJobEventListener" />
              </list>
            </entry>
          </map>
        </property>
    </bean>
    

上文提到的JOB_EXECUTION_SUCCESS、JOB_EXECUTION_FAILURE都是Activiti定义的事件类型,枚举类org.activiti.engine.delegate.event,ActivitiEventType.java中定义了42种事件类型。除此之外,我们还可以自定义事件类型,并监听。

  • 1
    点赞
  • 2
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值