Activiti - 1

Activiti - 1

Posted by fox on December 8, 2015

Activiti

ProcessEngine

ProcessEngine是Activiti的核心,目前有如下几种

  • org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration: 单独运行的流程引擎。Activiti会自己处理事务。 默认,数据库只在引擎启动时检测 (如果没有Activiti的表或者表结构不正确就会抛出异常)。

  • org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration: 单元测试时的辅助类。Activiti会自己控制事务。 默认使用H2内存数据库。数据库表会在引擎启动时创建,关闭时删除。 使用它时,不需要其他配置(除非使用job执行器或邮件功能)。

  • org.activiti.spring.SpringProcessEngineConfiguration: 在Spring环境下使用流程引擎。 参考Spring集成章节。

  • org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration: 单独运行流程引擎,并使用JTA事务。

快速开始

ProcessEngine processEngine = ProcessEngineConfiguration
                .createStandaloneInMemProcessEngineConfiguration()
                .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE)
                .setJdbcUrl("jdbc:h2:mem:my-own-db;DB_CLOSE_DELAY=1000")
                .setJobExecutorActivate(true)
                .buildProcessEngine();

这种方式不需要任何的配置,可以快速开始一个引擎

使用activiti.cfg.xml配置引擎

内存数据库

Activiti默认读取classpath目录下的activiti.cfg.xml文件,可以用如下配置快速开始一个内存数据库的引擎配置

<beans xmlns="http://www.springframework.org/schema/beans"
       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">
    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration">
        <property name="databaseType" value="h2"/>
        <property name="databaseSchemaUpdate" value="true"/>
        <property name="jobExecutorActivate" value="true"/>
        <property name="history" value="full"/>
    </bean>
</beans>

写一个测试类验证

public class JDBCEngine {

    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        ProcessEngineConfiguration configuration = processEngine.getProcessEngineConfiguration();
        System.out.println(processEngine.getName());
        System.out.println(configuration.getDatabaseType());
        System.out.println(configuration.getDatabaseSchemaUpdate());
        System.out.println(configuration.getHistory());
        System.out.println(configuration.getJobExecutor().isActive());
    }
}

很容易看出,输出结果和配置中是一致的

MYSQL数据库

测试类的代码不用任何改变,只需要改变activiti.cfg.xml的内容

<beans xmlns="http://www.springframework.org/schema/beans"
       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">


    <bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/activiti"/>
        <property name="username" value="root" />
        <property name="password" value="root" />
        <property name="defaultAutoCommit" value="false" />
    </bean>

    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="dataSource" ref="mysqlDataSource"/>
        <property name="databaseSchemaUpdate" value="true"/>
        <property name="jobExecutorActivate" value="false"/>
        <property name="history" value="full"/>
    </bean>
</beans>

  • databaseSchemaUpdate
	设置流程引擎启动和关闭时如何处理数据库表。
  1. false(默认):检查数据库表的版本和依赖库的版本, 如果版本不匹配就抛出异常。
  2. true: 构建流程引擎时,执行检查,如果需要就执行更新。 如果表不存在,就创建。
  3. create-drop: 构建流程引擎时创建数据库表, 关闭流程引擎时删除这些表。

使用上面的配置时,会自动创建相关的表,但是数据库(localhost:3306/activit)必须存在

跑一下刚才的demo类,可以看见输出的数据库类型已经变成了mysql

与spring的结合使用

activiti可以与spring结合,把生命周期的管理交给spring,可以很方便的结合在项目中

只需要改变和添加一些设置,例子activiti-config-with-spring.xml文件如下

<beans xmlns="http://www.springframework.org/schema/beans"
       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">


    <bean id="mysqlDataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/activiti"/>
        <property name="username" value="root" />
        <property name="password" value="root" />
        <property name="defaultAutoCommit" value="false" />
    </bean>

    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="dataSource" ref="mysqlDataSource"/>
        <property name="databaseSchemaUpdate" value="true"/>
        <property name="transactionManager" ref="transactionManager"/>
        <property name="jobExecutorActivate" value="false"/>
        <property name="history" value="full"/>
    </bean>


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

    <bean id="processEngine" class="org.activiti.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="formService" factory-bean="processEngine" factory-method="getFormService"/>
    <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>
    <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"/>
</beans>

写个小demo把xml读进来看一下

public class WithSpring {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("activiti-config-with-spring.xml");

        ProcessEngine processEngine = (ProcessEngine) applicationContext.getBean("processEngine");
        System.out.println(processEngine.getName());
        System.out.println(processEngine.getProcessEngineConfiguration().getDatabaseType());
    }
}

成功地加载了进来,正确输出了名字和数据库类型

这里需要注意的是,在写processEngineConfiguration 的配置时,使用的必须是org.activiti.spring.SpringProcessEngineConfiguration

以及需要事务的管理,org.springframework.jdbc.datasource.DataSourceTransactionManager