2. Activiti核心配置
ProcessEngine流程引擎是Activiti的核心。Activiti默认读取activiti.cfg.xml文件,获得ProcessEngineConfiguration对象,通过ProcessEngineConfiguration创建ProcessEngine。
2.1 ProcessEngineConfiguration配置
### 2.1.1 不使用配置文件
@Test
public void createEngineWithoutXml() {
ProcessEngineConfiguration processEngineConfiguration =
ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti?characterEncoding=utf-8");
processEngineConfiguration.setJdbcUsername("root");
processEngineConfiguration.setJdbcPassword("");
processEngineConfiguration.setDatabaseSchemaUpdate("true");
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
System.out.println(processEngine);
}
2.1.2 读取配置文件
配置文件activiti.cfg.xml,注意配置XML文件其实是一个spring的配置文件。 但不是说Activiti只能用在Spring环境中! 我们只是利用了Spring的解析和依赖注入功能 来构建引擎。
读取配置文件一共有五个方法:
1) ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();
2) ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource);
3) ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource, String beanName);
4) ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream);
5) ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName);
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/activiti?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value=""/>
</bean>
<!--带数据源-->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="dataSource" ref="dataSource"/>
<property name="databaseSchemaUpdate" value="true"/>
</bean>
<!--<property name="jdbcUrl" value="com.mysql.jdbc.Driver" />-->
<!--<property name="jdbcDriver" value="jdbc:mysql://localhost:3306/activiti?characterEncoding=utf-8" />-->
<!--<property name="jdbcUsername" value="root" />-->
<!--<property name="jdbcPassword" value="" />-->
<!--<property name="databaseSchemaUpdate" value="true"/>-->
@Test
public void createEngineWithXml() {
//默认读取的是activiti.cfg.xml,并且bean的id必须是processEngineConfiguration
// ProcessEngineConfiguration processEngineConfiguration =
// ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();
ProcessEngineConfiguration processEngineConfiguration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
System.out.println(processEngine);
}
如果自定义bean的id,可以这样读取:
ProcessEngineConfiguration processEngineConfiguration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml","configuration");
2.1.3 ProcessEngineConfiguration子类
创建ProcessEngineConfiguration时,目前可以使用如下类,以后会更多:
- org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration:
单独运行的流程引擎。Activiti会自己处理事务。 默认,数据库只在引擎启动时检测
(如果没有Activiti的表或者表结构不正确就会抛出异常)。- org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration:
单元测试时的辅助类。Activiti会自己控制事务。 默认使用H2内存数据库。数据库表会在引擎启动时创建,关闭时删除。
使用它时,不需要其他配置(除非使用job执行器或邮件功能)。- org.activiti.spring.SpringProcessEngineConfiguration:
在Spring环境下使用流程引擎。- org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration:
单独运行流程引擎,并使用JTA事务。
2.1.4 数据库配置
Activiti支持如下数据库:
数据库类型 url示例
h2 jdbc:h2:tcp://localhost/activiti
mysql jdbc:mysql://localhost:3306/activiti?autoReconnect=true
oracle jdbc:oracle:thin:@localhost:1521:xe
postgres jdbc:postgresql://localhost:5432/activiti
db2 jdbc:db2://localhost:50000/activiti
mssql jdbc:sqlserver://localhost:1433;databaseName=activiti (jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver) OR jdbc:jtds:sqlserver://localhost:1433/activiti (jdbc.driver=net.sourceforge.jtds.jdbc.Driver)
Activiti可能使用两种方式配置数据库。 第一种方式是定义数据库配置参数,另一种是直接配置DataSource。
直接配置数据库参数,有如下参数: • jdbcUrl: 数据库的JDBC URL。 • jdbcDriver: 对应不同数据库类型的驱动。
• jdbcUsername: 连接数据库的用户名。 • jdbcPassword: 连接数据库的密码。
基于JDBC参数配置的数据库连接 会使用默认的MyBatis连接池。 下面的参数可以用来配置连接池(来自MyBatis参数):
• jdbcMaxActiveConnections: 连接池中处于被使用状态的连接的最大值。默认为10。
• jdbcMaxIdleConnections: 连接池中处于空闲状态的连接的最大值。 • jdbcMaxCheckoutTime:
连接被取出使用的最长时间,超过时间会被强制回收。 默认为20000(20秒)。 • jdbcMaxWaitTime:
这是一个底层配置,让连接池可以在长时间无法获得连接时, 打印一条日志,并重新尝试获取一个连接。(避免因为错误配置导致沉默的操作失败)。
默认为20000(20秒)。 无论你使用JDBC还是DataSource的方式,都可以设置下面的配置: • databaseType:
一般不用设置,因为可以自动通过数据库连接的元数据获取。 只有自动检测失败时才需要设置。 可能的值有:{h2, mysql, oracle,
postgres, mssql, db2}。这个配置会决定使用哪些创建/删除脚本和查询语句。
• databaseSchemaUpdate: 设置流程引擎启动和关闭时如何处理数据库表,可能值如下:
- false(默认):检查数据库表的版本和依赖库的版本, 如果版本不匹配就抛出异常。
- true: 构建流程引擎时,执行检查,如果需要就执行更新。 如果表不存在,就创建。
- create-drop: 构建流程引擎时创建数据库表,
关闭流程引擎时删除这些表。
使用数据源的配置参考各种DataSource的使用说明,ProcessEngineConfiguration的dataSource属性引用定义的数据源即可。如2.1.2中使用了DBCP的数据源。
2.2 ProcessEngine创建
@Test
public void createDefaultEngine() {
//默认读取的是activiti.cfg.xml,并且bean的id必须是processEngineConfiguration
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
}
ProcessEngines.getDefaultProcessEngine()方法读取的是activiti.cfg.xml,且bean的id必须是processEngineConfiguration。
使用ProcessEngineConfiguration创建:
ProcessEngineConfiguration processEngineConfiguration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
System.out.println(processEngine);
2.3 数据库说明
Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。
ACT_RE_: 'RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_: RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。
Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_:'ID’表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_: 'HI’表示history。这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。 资源库流程规则表
- act_re_deployment 部署信息表
- act_re_model 流程设计模型部署表
- act_re_procdef 流程定义数据表
- act_re_event_subscr 事件监听
运行时数据库表
- act_ru_execution 运行时流程执行实例表
- act_ru_identitylink运行时流程人员表,主要存储任务节点与参与者的相关信息
- act_ru_task 运行时任务节点表
- act_ru_variable运行时流程变量数据表
- act_ru_job 异步作业
历史数据库表
1) act_hi_actinst 历史节点表
2)act_hi_attachment 历史附件表
3) act_hi_comment 历史意见表,评论
4) act_hi_identitylink 历史流程人员表
5) act_hi_detail 历史详情表,提供历史变量的查询
6)act_hi_procinst 历史流程实例表
7) act_hi_taskinst 历史任务实例表
8) act_hi_varinst 历史变量表
组织机构表 1) act_id_group 用户组信息表 2) act_id_info 用户扩展信息表 3) act_id_membership 用户与用户组对应信息表 4) act_id_user 用户信息表
这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足
通用数据表
1)act_ge_bytearray 二进制数据表,所有二进制内容保存到这个表,比如bpmn文件。
2) act_ge_property属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,
其它数据表
- act_evt_log 事件日志,默认不开启
- act_procdef_info 流程定义的动态变更信息
2.4 Activiti对象说明
a) 几个和流程相关的对象
Deployment:部署对象,和部署表(act_re_deployment)对应
ProcessDefinition:流程定义对象,和流程定义表(act_re_procdef)对应
ProcessInstance:流程实例对象,和流程实例表(act_ru_execution)对应
Task:任务对象,和任务表(act_ru_task)对应b) 几个Service对象
RepositoryService:操作部署、流程定义等静态资源信息
RuntimeService:操作流程实例,启动流程实例、查询流程实例、删除流程实例等动态信息
TaskService:操作任务,查询任务、办理任务等和任务相关的信息 HistoryService:操作历史信息的,查询历史信息
IdentityService:操作用户和组c) 几个Query对象
DeploymentQuery:对应查询部署表(act_re_deployment)
ProcessDefinitionQuery:对应查询流程定义表(act_re_procdef)
ProcessInstanceQuery:对应查询流程实例表(act_ru_execution)
TaskQuery:对应查询任务表(act_ru_task)bpmn通过RepositoryService部署,引擎会把bpmn解析成可执行的东西,生成一个Deployment(部署),对应的生成流程定义(ProcessDefinition)。
通过RuntimeService启动流程定义,得到一个流程实例。同时会生Task(任务),任务是绑定到用户的,记录当前操作者是谁,任务状态是什么,用TaskService操作任务。