activiti搭建(⼀)初始化数据库
  activiti-engine.jar包中⾃带了创建activiti⼯作流数据库表的SQL语句和⾃动初始化数据库的⽅法。SQL语句在org.ate包下,初始化⽅法在ine.impl.db.DbSchemaCreate的main⽅法之中。
public class DbSchemaCreate {
public static void main(String[] args) {
ProcessEngineConfiguration
.createProcessEngineConfigurationFromResourceDefault()
.setDatabaseSchemaUpdate(ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_CREATE)
.buildProcessEngine();
}
}
  以上都是以5.21版本的包为例。由第⼀张图可以看出两点:(⼀)⽬前activiti⽀持的数据库类型有:db2、h2、hsql、mssql、mysql、oracle 和postgres数据库。(⼆)activiti的数据库表核⼼在于engine,identity和history是分离了出来。根据官⽅指导⼿册的说法,activiti的history功能是可以选择是否开启的,如果不需要⾃然不⽤history相关的表,⽽identity和⽤户以及⽤户组相关的表也是不⼀定需要的,可以使⽤⾃⼰的⽤户结构表(具体怎么做还没有尝试)。
  初始化数据库的代码很简单,其实际上就是使⽤配置⽂件创建了⼀个⼯作流引擎,只是将配置项中的databaseSchemaUpdate改成了create,这句就是创建数据库的含义。下⾯详细说⼀下具体操作步骤,本次操作是基于maven的,不会的需要⾃⼰⼿动导⼊包,使⽤maven也是为了不⽤下载依赖包。数据库使⽤的是mysql。开发⼯具⽤的eclipse。
  主要步骤有四步:
  1.添加activiti-engine.jar包以及其依赖包到构建路径
  2.添加mysql-connector-java包,mysql数据库的驱动包
  3.编写l配置⽂件,将其放⼊classpath下,maven项⽬就是src/main/resources下就⾏了。
  4.运⾏DbSchemaCreate的main⽅法
  下⾯是相关操作:
  1.新建⼀个maven项⽬,这个就不讲了。在l中添加activiti-engine依赖:
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.21.0</version>
</dependency>
  2.添加mysql数据库驱动依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
  3.在src/main/resources下新建⼀个⽂件,命名为l(不能是其它的名字)。在⾥⾯配置以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans.xsd">
<bean id="processEngineConfiguration" class="ine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="databaseType" value="mysql"></property> <!-- 数据库类型,最好配置⼀下 -->
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti"></property> <!-- 数据库URL,我放在名为activiti数据库中 -->
<property name="jdbcDriver" value="sql.jdbc.Driver"></property> <!-- 数据库驱动类 mysql是这个,其它的数据库修改⼀下即可 -->
<property name="jdbcUsername" value="root"></property> <!-- 连接数据库的账号 -->
<property name="jdbcPassword" value="root"></property> <!-- 连接数据库的密码 -->
<!-- <property name="databaseSchema" value="activiti"></property> --> <!-- 这个属性可能会⽤到,后⾯会进⾏说明 -->
</bean>
</beans>
  ⾥⾯的相关配置databaseType,jdbcUrl等5个配置项,改成⾃⼰的相符合的就⾏了。
  4.eclipse中选中项⽬,右击选择Run As->Java Application,在弹出的框Select type中输⼊DBSchemaCreate,选择Matching items中相应的类,点击OK即可,如图:
  如果没什么问题,⽤⼯具查看数据库,应该是能够看到⾃动创建出来的25张表的。
  但是有的时候会出现⼀些问题。oracle数据库中,如果存在⼀个⽤户建了这些表,⽽我使⽤另⼀个⽤户建这些表会失败。或者是建好表后,将⽤户删除,再重新创建这个⽤户,⼀样会导致创建表失败,提⽰:表或视图不存在。这个问题的产⽣与程序执⾏和oracle数据库的机制有关。
  ⾸先看程序,启动项⽬后会验证⼀次数据库的表结构版本和当前jar包版本是否匹配,这个流程是为了校验⽽已。⽽在初始化数据库的时候⼀般不会执⾏这个校验,但是当错误的判定数据库的表存在时,会错误的进⼊校验数据库表结构版本的分⽀之中,导致原本数据库还没有初始化表,却去查询表act_ge_property(存放了版本信息),⾃然⽽然地报了表或视图不存在了。问题在于为什么明明表不存在,却判定表⽰存在的。
  查看异常链追踪源代码会发现其实际上判断的是表act_ru_execution是否存在。其从DbSqlSession的dbSchemaCreate()⽅法开始:
  public void dbSchemaCreate() {
if (isEngineTablePresent()) {
String dbVersion = getDbVersion();
if (!ProcessEngine.VERSION.equals(dbVersion)) {
throw new ActivitiWrongDbException(ProcessEngine.VERSION, dbVersion);
}
} else {
dbSchemaCreateEngine();
}
if (dbSqlSessionFactory.isDbHistoryUsed()) {
dbSchemaCreateHistory();
}
if (dbSqlSessionFactory.isDbIdentityUsed()) {
dbSchemaCreateIdentity();
}
}
  这段代码很清楚地展⽰了相关关系,先判断表是否存在,存在就验证版本号,不存在就创建engine,后⾯判断history和identity是否被使⽤(默认使⽤),使⽤了就创建相关的表。这⾥很明显就是isEngineTablePresent()返回了true才导致了这个问题,继续追踪到这个类中的isTablePresent()⽅法,其真正作⽤的是下⾯这段:
public static String[] JDBC_METADATA_TABLE_TYPES = {"TABLE"};
try {
tables = Tables(catalog, schema, tableName, JDBC_METADATA_TABLE_TYPES);
();
} finally {
try {
tables.close();
} catch (Exception e) {
<("Error closing meta data tables", e);
}
}
  第⼆个参数对于oracle数据库来说⽐较重要,就像之前说的造成这个问题的两种可能的场景。如果出现了这个问题,就需要配置,使schema 这个参数为⼤写的登陆⽤户名(必须⼤写,与oracle的机制有关)。这个参数的设置,不断向上查源码,会发现只需要在配置⽂件中配置databaseSchema属性就可以了(value⼤写)。mysql数据库应该就没有太⼤问题了。
  最后简单介绍⼀下activiti数据库表的组成。之前看创建数据库的sql语句就很清楚,表分为必要的engi
ne和⾮必要的history以及identity。其中act_hi_*这8张表就与history相关。act_id_*这4张与identity有关。剩余的全是engine必备的表,也可以简单的分下类:act_ru_*这6张表是runtime流程运⾏中相关的表。act_re_*这3张表是repository这个是管理部署和流程定义相关的表,基本不会改变,除⾮更改部署和流程定义。
mysql下载jar包act_ge_property存放了数据库表版本的相关信息,只有在升级版本的时候会改变。act_ge_bytearray存放了⼀些字节流数据,⼀般是各种资源数据如流程定义的xml,流程图等。act_evt_log看名字就知道是事件⽇志的表,如何使⽤暂时不知。最后⼀张act_procdef_info表看名字也就是流程定义详情表。那些归类了得表具体作⽤看*,其后缀的名字,⼤概就知道其具体作⽤,如:task(任务)、variable(变量)等,这⾥就不⼀⼀介绍了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。