结构:

ps:activiti5.16.3 依赖 spring4.x
概念:
部署对象 ——Deployment:一次部署的多个文件的信息,通常有 .jpdl.xml 和 .png 两个文件。删除流程定义其实删的就是部署对象
流程定义 ——ProcessDefintion:解析 .jpdl.xml 后得到的流程的信息,其中包含流程中所有的环节和每个环节的详细信息等。查询流程相关信息其实就是查询流程定义
流程实例 ——ProcessInstance:
Activiti 的持久化方式
Activiti 默认使用 Mybatis3 做持久化工作, 可以在配置中设置流程引擎启动时创建表。
Activiti 使用到的表都是 ACT_开头的。
ACT_RE_* |
流程定义存储。 |
ACT_RU_* |
流程执行记录, 记录流程启动到结束的所有动作, 流程结束后会清除相关记录。 |
ACT_ID_* |
用户记录, 流程中使用到的用户和组。 |
ACT_HI_* |
流程执行的历史记录。 |
ACT_GE_* |
通用数据及设置。 |
使用到的表:
ACT_GE_BYTEARRAY |
流程部署的数据。 |
ACT_GE_PROPERTY |
通用设置。 |
ACT_HI_ACTINST |
流程活动的实例。 |
ACT_HI_ATTACHMENT |
|
ACT_HI_COMMENT |
|
ACT_HI_DETAIL |
|
ACT_HI_PROCINST |
流程实例。 |
ACT_HI_TASKINST |
任务实例。 |
ACT_ID_GROUP |
用户组。 |
ACT_ID_INFO |
|
ACT_ID_MEMBERSHIP |
|
ACT_ID_USER |
用户。 |
ACT_RE_DEPLOYMENT |
部署记录。 |
ACT_RE_PROCDEF |
流程定义。 |
ACT_RU_EXECUTION |
流程执行记录。 |
ACT_RU_IDENTITYLINK |
|
ACT_RU_JOB |
|
ACT_RU_TASK |
执行的任务记录。 |
ACT_RU_VARIABLE |
执行中的变量记录 |
activiti5.13 框架 数据库设计说明书
创建数据库与表
使用无配置文件的方式创建数据库与表
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @Test public void createSchema() throws Exception { ProcessEngineConfiguration pfg = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration(); ProcessEngine pg = pfg.setJdbcDriver("com.mysql.jdbc.Driver") .setJdbcUrl("jdbc:mysql:///activiti_test?createDatabaseIfNotExist=true") .setJdbcUsername("root") .setJdbcPassword("root") .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE) .buildProcessEngine(); }
|
使用配置文件创建数据库与表
activiti.cfg.xml 内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?xml version="1.0" encoding="UTF-8"?> <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.StandaloneProcessEngineConfiguration"> <property name="jdbcDriver" value="com.mysql.jdbc.Driver" /> <property name="jdbcUrl" value="jdbc:mysql:///activiti_test?createDatabaseIfNotExist=true" /> <property name="jdbcUsername" value="root" /> <property name="jdbcPassword" value="root" /> <property name="databaseSchemaUpdate" value="true" /> </bean>
</beans>
|
测试代码:
1 2 3 4 5 6
| @Test public void createSchema() throws Exception { ProcessEngine pg = ProcessEngines.getDefaultProcessEngine(); }
|
部署流程定义
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Test public void deployProcessDefintion() {
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("base/BaseProcess.bpmn") .addClasspathResource("base/BaseProcess.png") .deploy(); }
|
通过开源的 zip 格式压缩包来部署流程定义(框架会自动解压 zip 文件)
测试代码:
1 2 3 4 5 6 7 8 9
| @Test public void deployProcessDefintionUseZip() { Deployment deployment = repositoryService.createDeployment() .addZipInputStream(new ZipInputStream(this.getClass().getResourceAsStream("/BaseProcess.zip"))) .deploy(); }
|
部署流程定义后,数据库会做出以下修改:
act_re_deployment |
新增一条记录(其中包括流程定义部署对象的显示别名和部署时间) |
act_re_deployment |
新增一条记录(其中包括 —— ID_:格式为 key : version : 随机数 CATEGORY_:流程定义文件的 Namespace NAME_:流程定义文件的 Name,默认等于 id KEY_:流程定义文件的 Key VERSION_:流程定义文件的版本号(同一个 key 的部署次数) DEPLOYMENT_ID_:用于与 act_re_deployment 做关联 RESOURCE_NAME_:资源文件的名称(即在 classpath 的相对路径) DGRM_RESOURCE_NAME_:图像资源文件的名称(即在 classpath 的相对路径) SUSPENSION_STATE_:挂起状态(1 为正常状态) ) |
act_ge_bytearray |
新增至少一条记录(通常是流程定义文件和图片等) |
启动流程实例
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Test public void startProcessInstance() { RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<String, Object>(); variables.put("employeeName", "Kermit"); variables.put("numberOfDays", new Integer(4)); variables.put("vacationMotivation", "我有点累了");
runtimeService.startProcessInstanceByKey("vacationRequest", variables);
}
|
查询用户的候选任务列表
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Test public void findUserPersonalTaskList() { TaskService taskService = processEngine.getTaskService(); String userName = "张三"; List<Task> tasks = taskService.createTaskQuery() .taskAssignee(userName) .list(); System.out.println("■■■■■■■■■■■■" + userName + "的任务列表为" + "■■■■■■■■■■■■"); for (Task task : tasks) { System.out.println("任务ID:" + task.getId() + "\t任务名称:" + task.getName() + "\t任务描述:" + task.getDescription()); } }
|
挂起流程定义和激活一个流程实例
测试代码:
1 2 3 4 5 6
| repositoryService.suspendProcessDefinitionByKey("vacationRequest"); try { runtimeService.startProcessInstanceByKey("vacationRequest"); } catch (ActivitiException e) { e.printStackTrace(); }
|
流程定义被挂起后就不能创建该定义的新实例(会抛出异常)。
如果要重新激活一个暂停的流程定义,只要调用 repositoryService.activateProcessDefinitionXXX 方法即可
流程实例也可以通过 runtimeService.suspendProcessInstance 方法被挂起,一旦挂起流程就不能往下进行(比如调用完成任务的方法会抛出异常),工作(jobs)也不会执行(比如 timers)
如果要重新激活一个暂停的流程定义,只要调用 runtimeService.activateProcessInstanceXXX 方法即可
activiti 与 Spring 集成
applicationContext.xml 的部分内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager" />
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <property name="dataSource" ref="dataSource" /> <property name="transactionManager" ref="transactionManager" /> <property name="databaseSchemaUpdate" value="true" /> <property name="jobExecutorActivate" value="false" /> </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="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" />
|