DependencyTask 任务依赖框架
背景
在我们的程序中,经常会有序列的操作流程集合,就像工厂的组装流程,先执行任务1,然后任务2,任务n…, 各个任务之间是有依赖关系的,比如,执行任务4之前,任务3和任务2要完成了才行。一个具体的例子,比如,app中的启动过程,一般包含权限检查,用户登录,引擎初始化等一系列的操作,这些操作有些可能有依赖关系,而且这些依赖关系随着需求的变化也可能发生变化,这里我们就可以使用下面介绍的 DepengdencyTask 任务依赖框架
这个一个用Kotlin编写的基于协程并发的轻巧框架
框架特征
- 框架可以检查任务的循环依赖
- 没有依赖关系的任务可以并发地执行(可以指定任务执行的Disaptacher)
- 同一个任务执行器被调用多次,不会多次执行;只会从上一次执行失败的任务开始继续执行
- 如果任务执行器在运行期间,会检查状态,正在运行时,不会再执行任务。
引用
maven
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependency>
<groupId>com.github.Arrowyi</groupId>
<artifactId>DependencyTask</artifactId>
<version>TheVersion</version>
</dependency>
gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.Arrowyi:DependencyTask:TheVersion'
}
用法介绍
- 先把自己的流程梳理清楚,分成若干任务 (可以有依赖)
- 继承Task类,编写自己的任务类
- 实现任务类的action方法。action方法为suspend 方法,可以任意的coroutine中运行,注意:无论action方法的结果如果,都需要调用actionRersult方法通知框架任务处理结束
- 创建TaskProcessor执行器,调用start方法获取一个Flow
- 调用Flow的 collect方法开始执行操作流程,colloct方法收集执行过程中的状态
Flow 的状态类
//check if there is circular dependency , true is for check ok (no circular dependency), false will end the processor, and the tasks is all
//the tasks this processor will do.
class Check(val result: Boolean, val tasks: List<Task>?) : ProgressStatus()
//called if the task is done
class Progress(val task: Task) : ProgressStatus()
//called if all the tasks is done successfully, and the processor will be ended
class Complete : ProgressStatus()
//called if any of the task failed, and the processor will be ended immediately
class Failed(val failedTask: Task) : ProgressStatus()
//The Processor is already running, and this flow will be ended
class AlreadyRunning() : ProgressStatus()
例子
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
class SuspendTask : Task() {
override suspend fun doAction() {
//do suspend job
delay(100)
actionResult(true)
}
}
class BlockTask : Task() {
override suspend fun doAction() {
//some block job
Thread.sleep(100)
actionResult(true)
}
}
class SomeTask(private val name: String) : Task() {
override suspend fun doAction() {
actionResult(true)
}
override fun getTaskDescription(): String {
return name
}
}
fun main() = runBlocking {
val task1 = SuspendTask()
val task2 = BlockTask()
val task3 = SomeTask("task 3")
val task4 = SomeTask("task 4")
task2.addDependency(task1)
task3.addDependency(task1)
task3.addDependency(task2)
task4.addDependency(task3)
TaskProcessor(task1).start().collect() {
when (it) {
is Check -> println("check result is : ${it.result}")
is Progress -> println("task : ${it.task.getDescription()} is done")
is Complete -> println("all the task is done successfully,and the flow is ended")
is Failed -> println("task : ${it.failedTask.getDescription()} is failed , and the flow is ended ")
}
}
}
更多的使用方法可以参考项目中的测试用例
任务执行示例

如上示例,当调用任务执行器开始执行任务时,过程为:
-
- 执行任务1
-
- 任务1完成时,任务2和任务3并发地执行
-
- 任务2完成时会并发地执行任务4, 任务3完成时会并发地执行任务5和任务6
-
- 任务5完成时会执行任务8, 当任务2和任务5都完成时会执行任务7,
-
- 任务7完成时会执行任务9, 任务7和任务8都完成时,会执行任务10
-
- 当所有任务都完成的时候,会收到complete消息,流程结束。
DependencyTask是一个基于Kotlin和协程的轻量级框架,用于处理任务依赖关系。它能检查循环依赖,允许多个无依赖任务并发执行,并在运行时防止重复执行。通过创建Task子类并实现action方法,可以构建任务流程。使用TaskProcessor启动任务流,通过collect方法收集执行状态。例如,在启动流程中,任务按依赖顺序执行,完成一个阶段后,后续任务并发进行,直到所有任务完成。
6797

被折叠的 条评论
为什么被折叠?



