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
设置流程引擎启动和关闭时如何处理数据库表。
- false(默认):检查数据库表的版本和依赖库的版本, 如果版本不匹配就抛出异常。
- true: 构建流程引擎时,执行检查,如果需要就执行更新。 如果表不存在,就创建。
- 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