这是我参与更文挑战的第10天,活动详情查看: 更文挑战
首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
一 . 前言
此篇文档将开启 Activiti 的系列文档 , 所以这篇文章的内容主要以流程使用为主 , 为了更清晰 , 我们由 Task 往外层分析 >>>
后续再来看看 Process 实例的创建以及配置的处理
二 . 整体使用
2.1 Maven 依赖
1 | xml复制代码<dependency> |
2.2 application.yml
PS : 无需创建数据库 , Activiti 中会默认创建表 , 创建流程我们以后来看 >>>
1 | java复制代码spring: |
默认会建如下表 :
2.3 前置准备
Activiti 默认是需要和用户绑定的 , 此处需要进行必要的配置 :
在缓存中添加2个用户
1 | java复制代码@Configuration |
模拟登录工具类
1 | java复制代码@Component |
2.4 一个简单的 flow 流程
1 | java复制代码@RestController |
三 . Task 核心流程
1 | java复制代码@Component |
3.1 TaskRuntime 模块
接口一览
1 | java复制代码C- TaskRuntime |
方法作用
- Task task(String taskId) : 通过id获取任务
- Page tasks(Pageable pageable); 获取当前认证用户所有的 Task
- Page tasks(Pageable pageable,GetTasksPayload getTasksPayload) : 获取在Payload中应用筛选器的所有任务
- Task create(CreateTaskPayload createTaskPayload) : 创建 Task
- Task claim(ClaimTaskPayload claimTaskPayload) : 声明一个 Task
- 如果没有经过验证的用户抛出IllegalStateException
- 如果当前认证用户不是一个候选用户抛出IllegalStateException
- 当前方法不支持模拟,它将始终接受当前已验证的用户
- 在声明之后,任务应该处于分配状态
- Task release(ReleaseTaskPayload releaseTaskPayload) : 发布一个先前声明的任务
- Task complete(CompleteTaskPayload completeTaskPayload) : 在有效负载中设置变量来完成选定的任务
- 此方法还检查任务是否在完成之前分配给当前已验证的用户
- 该方法返回一个浅层Task对象,其中包含验证任务已完成所需的基本信息
- Task update(UpdateTaskPayload updateTaskPayload) : 更新任务详细信息
- Task delete(DeleteTaskPayload deleteTaskPayload) : 删除任务
3.2 Task 对象
Task 是流程中的核心流转对象 , 来看一下该对象的参数有哪些 :
1 | java复制代码public interface Task extends TaskInfo { |
3.3 TaskRuntimeImpl 模块
TaskRuntimeImpl 是 TaskRuntime 的实现类 , Task 处理中 ,通过该对象实现业务的具体操作 , 我们以删除操作为例 , 看一下整体的流程 :
Step 1 : Delete 的触发
在业务中 ,通过调用 方法触发对 Task 的删除操作
1 | java复制代码 public void deleteTask() { |
PS : 这里我们做了一个特殊操作 ->securityUtil.logInAs("admin");
这是因为 Task 的操作是由权限划分的 ,对应的人员只能操作自己的 Task
Step 2 : 调用 TaskRuntimeImpl # delete 方法
1 | java复制代码 public Task delete(DeleteTaskPayload deleteTaskPayload) { |
其中有2个需要注意的地方 :
- C- DeleteTaskCmd : 该对象是一个命令对象 , 猜测这里是使用命令模式进行处理
- C- commandExecutor 对象
来看一下对象是干嘛的 :
1 | java复制代码// commandExecutor 是一个接口 , 其中有三个方法 |
PS : 到了 first.execute(config, command); 这一步 ,实际上就开始调用拦截器链了
Step 3 : 拦截器链的调用
拦截链的生成后面展示 , 这里只说一说执行了什么
1 | java复制代码// 从前面我们分析 Delete 流程的时候就可以看到 , 其走了一个拦截链 ,如下图所示 : |
这些拦截链并不是全部会走 , 主要走的如下几个 :
- Step 1 : SpringTransactionInterceptor : 控制事务
- Step 2 : CommandContextInterceptor : 准备容器
- Step 3 : TransactionContextInterceptor : 构建 TransactionContext
- Step 4 : CommandInvoker 中准备 DbSqlSession , 通过 executeOperation # runnable.run() 执行处理线程
- Step 5 : NeedsActiveTaskCmd 执行 TaskCmd
- Step 6 : CompleteTaskCmd 发起 execute 执行 (PS : 操作类型在 Command 中 ,典型的命令模式)
- Step End : TaskEntityManagerImpl 中执行具体的 DB 操作
总结
这一篇基本上把主流程大概介绍完了 , 后面来深入一下以下操作 :
- SpringConfiguration 操作
- 整体 Process 流程
- 定制操作处理
本文转载自: 掘金