文章目录
- 1、Activiti7 核心类体系架构
- 2、流程引擎配置类 - ProcessEngineConfiguration
- 2.1 StandaloneProcessEngineConfiguration
- 2.2 SpringProcessEngineConfiguration
- 2.3 创建processEngineConfiguration
- 3、工作流引擎创建 - ProcessEngine
- 3.1 默认创建方式
- 3.2 通用方式
- 4、Servcie服务接口
- 4.1 Service创建方式
- 4.2 Service总览
- 5、使用示例:核心对象创建与服务获取
- 5.1. 创建流程引擎 (ProcessEngine)
- 5.2. 获取服务并操作
上一章节我们通过java代码中我们调用Activiti的工具类完成了Activiti数据库表的生成,本节带大家来了解Activiti的类关系,通过各个工具类关系图梳理出它的核心体系架构、各类间的关系以及主要服务接口的作用。
1、Activiti7 核心类体系架构
Activiti7的类结构围绕 ProcessEngine(流程引擎) 这个核心入口展开,其核心关系可以概括为以下模式:
- activiti.cfg.xml
activiti的引擎配置文件,包括:ProcessEngineConfiguration的定义、数据源定义、事务管理器等,此文件其实就是一个spring配置文件。
2、流程引擎配置类 - ProcessEngineConfiguration
这是创建流程引擎的工厂类,负责读取配置(如数据源、事务管理等)。根据是否与Spring整合,有两种主要实现:
StandaloneProcessEngineConfiguration:用于Activiti独立运行,自己管理事务。
SpringProcessEngineConfiguration:用于与Spring框架整合,使用Spring的事务管理。
2.1 StandaloneProcessEngineConfiguration
使用StandaloneProcessEngineConfigurationActiviti可以单独运行,来创建ProcessEngine,Activiti会自己处理事务。
配置文件方式:通常在activiti.cfg.xml配置文件中定义一个id为 processEngineConfiguration 的bean.
方法如下:
<beanid="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"><!--配置数据库相关的信息--><!--数据库驱动--><propertyname="jdbcDriver"value="com.mysql.jdbc.Driver"/><!--数据库链接--><propertyname="jdbcUrl"value="jdbc:mysql:///activiti"/><!--数据库用户名--><propertyname="jdbcUsername"value="root"/><!--数据库密码--><propertyname="jdbcPassword"value="123456"/><!--actviti数据库表在生成时的策略 true - 如果数据库中已经存在相应的表,那么直接使用,如果不存在,那么会创建--><propertyname="databaseSchemaUpdate"value="true"/></bean>还可以加入连接池:
<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"><propertyname="driverClassName"value="com.mysql.jdbc.Driver"/><propertyname="url"value="jdbc:mysql:///activiti"/><propertyname="username"value="root"/><propertyname="password"value="123456"/><propertyname="maxActive"value="3"/><propertyname="maxIdle"value="1"/></bean><!--在默认方式下 bean的id 固定为 processEngineConfiguration--><beanid="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"><!--引入上面配置好的 链接池--><propertyname="dataSource"ref="dataSource"/><!--actviti数据库表在生成时的策略 true - 如果数据库中已经存在相应的表,那么直接使用,如果不存在,那么会创建--><propertyname="databaseSchemaUpdate"value="true"/></bean></beans>2.2 SpringProcessEngineConfiguration
通过org.activiti.spring.SpringProcessEngineConfiguration 与Spring整合。
创建spring与activiti的整合配置文件:
activity-spring.cfg.xml(名称可修改)
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"><!-- 工作流引擎配置bean --><beanid="processEngineConfiguration"class="org.activiti.spring.SpringProcessEngineConfiguration"><!-- 数据源 --><propertyname="dataSource"ref="dataSource"/><!-- 使用spring事务管理器 --><propertyname="transactionManager"ref="transactionManager"/><!-- 数据库策略 --><propertyname="databaseSchemaUpdate"value="drop-create"/><!-- activiti的定时任务关闭 --><propertyname="jobExecutorActivate"value="false"/></bean><!-- 流程引擎 --><beanid="processEngine"class="org.activiti.spring.ProcessEngineFactoryBean"><propertyname="processEngineConfiguration"ref="processEngineConfiguration"/></bean><!-- 资源服务service --><beanid="repositoryService"factory-bean="processEngine"factory-method="getRepositoryService"/><!-- 流程运行service --><beanid="runtimeService"factory-bean="processEngine"factory-method="getRuntimeService"/><!-- 任务管理service --><beanid="taskService"factory-bean="processEngine"factory-method="getTaskService"/><!-- 历史管理service --><beanid="historyService"factory-bean="processEngine"factory-method="getHistoryService"/><!-- 用户管理service --><beanid="identityService"factory-bean="processEngine"factory-method="getIdentityService"/><!-- 引擎管理service --><beanid="managementService"factory-bean="processEngine"factory-method="getManagementService"/><!-- 数据源 --><beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"><propertyname="driverClassName"value="com.mysql.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/activiti"/><propertyname="username"value="root"/><propertyname="password"value="mysql"/><propertyname="maxActive"value="3"/><propertyname="maxIdle"value="1"/></bean><!-- 事务管理器 --><beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="dataSource"/></bean><!-- 通知 --><tx:adviceid="txAdvice"transaction-manager="transactionManager"><tx:attributes></tx:attributes><!-- 传播行为 --><tx:methodname="save*"propagation="REQUIRED"/><tx:methodname="insert*"propagation="REQUIRED"/><tx:methodname="delete*"propagation="REQUIRED"/><tx:methodname="update*"propagation="REQUIRED"/><tx:methodname="find*"propagation="SUPPORTS"read-only="true"/><tx:methodname="get*"propagation="SUPPORTS"read-only="true"/></tx:attributes></tx:advice><!-- 切面,根据具体项目修改切点配置 --><aop:configproxy-target-class="true"><aop:advisoradvice-ref="txAdvice"pointcut="execution(* com.itheima.ihrm.service.impl.*.(..))"*/></aop:config></beans>2.3 创建processEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")上边的代码要求activiti.cfg.xml中必须有一个processEngineConfiguration的bean也可以使用下边的方法,更改bean 的名字:
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource, String beanName);3、工作流引擎创建 - ProcessEngine
这是Activiti工作的核心门户,通过它可以获取所有操作流程的Service;(通过ProcessEngineConfiguration创建processEngine,通过ProcessEngine创建各个service接口)创建方式通常有两种:
3.1 默认创建方式
使用 ProcessEngines.getDefaultProcessEngine(),它会自动加载classpath下名为 activiti.cfg.xml 的配置文件。:
//直接使用工具类 ProcessEngines,使用classpath下的activiti.cfg.xml中的配置创建processEngineProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();System.out.println(processEngine);3.2 通用方式
先构建ProcessEngineConfiguration,再通过其buildProcessEngine()方法创建。
//先构建ProcessEngineConfigurationProcessEngineConfigurationconfiguration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");//通过ProcessEngineConfiguration创建ProcessEngine,此时会创建数据库ProcessEngineprocessEngine=configuration.buildProcessEngine();4、Servcie服务接口
Service是工作流引擎提供用于进行工作流部署、执行、管理的服务接口,我们使用这些接口可以就是操作服务对应的数据表;
所有对工作流的操作都通过从ProcessEngine中获取的各种Service完成。在Activiti7中,IdentityService和FormService已被移除。以下是核心的五个Service及其作用:
4.1 Service创建方式
通过ProcessEngine创建Service
方式如下:
RuntimeServiceruntimeService=processEngine.getRuntimeService();RepositoryServicerepositoryService=processEngine.getRepositoryService();TaskServicetaskService=processEngine.getTaskService();4.2 Service总览
| 服务接口 | 主要职责 | 关键操作举例 |
|---|---|---|
| RepositoryService | 流程资源与部署管理。管理流程定义、模型等静态信息。 | 部署流程定义(.bpmn文件)、查询流程定义、挂起/激活流程。 |
| RuntimeService | 流程运行实例管理。负责启动流程实例、设置流程变量等动态操作。 | 启动流程实例、查询执行实例、触发流程事件。 |
| TaskService | 用户任务管理。处理流程中需要人工参与的任务。 | 查询用户任务、完成任务、认领任务、设置任务负责人。 |
| HistoryService | 历史数据查询。提供对已执行流程的历史信息的查询功能,用于审计和报表。 | 查询已结束的流程实例、历史任务详情、流程变量变更记录。 |
| ManagementService | 引擎管理维护。提供对Activiti引擎本身的维护和管理功能,通常在系统管理时使用。 | 查询数据库表、管理异步作业。 |
简单介绍:
- RepositoryService
是activiti的资源管理类,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的业务流程图需要使用此service将流程定义文件的内容部署到计算机。
除了部署流程定义以外还可以:查询引擎中的发布包和流程定义。
暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。
获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。
- RuntimeService
Activiti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息
- TaskService
Activiti的任务管理类。可以从这个类中获取任务的信息。
- HistoryService
Activiti的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。
- ManagementService
Activiti的引擎管理类,提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护。
5、使用示例:核心对象创建与服务获取
5.1. 创建流程引擎 (ProcessEngine)
// 方式一:默认配置(需要classpath下有activiti.cfg.xml)ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();// 方式二:自定义配置ProcessEngineConfigurationconfig=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");ProcessEngineprocessEngine=config.buildProcessEngine();5.2. 获取服务并操作
创建引擎后,即可获取各个Service进行业务操作
// 获取部署服务RepositoryServicerepositoryService=processEngine.getRepositoryService();// 部署一个流程Deploymentdeployment=repositoryService.createDeployment().addClasspathResource("holiday-request.bpmn20.xml").deploy();// 获取运行时服务RuntimeServiceruntimeService=processEngine.getRuntimeService();// 使用流程定义的Key启动一个流程实例ProcessInstanceinstance=runtimeService.startProcessInstanceByKey("holidayRequest");// 获取任务服务TaskServicetaskService=processEngine.getTaskService();// 查询某个用户的待办任务List<Task>tasks=taskService.createTaskQuery().taskAssignee("zhangsan").list();// 完成任务taskService.complete(taskId);总而言之,理解Activiti7类关系的关键是掌握“配置 -> 引擎 -> 服务”这条主线。所有的业务操作都通过从ProcessEngine中获取的五大Service来完成。
“人的一生会经历很多痛苦,但回头想想,都是传奇”。