DependencyTask 任务依赖框架

DependencyTask是一个基于Kotlin和协程的轻量级框架,用于处理任务依赖关系。它能检查循环依赖,允许多个无依赖任务并发执行,并在运行时防止重复执行。通过创建Task子类并实现action方法,可以构建任务流程。使用TaskProcessor启动任务流,通过collect方法收集执行状态。例如,在启动流程中,任务按依赖顺序执行,完成一个阶段后,后续任务并发进行,直到所有任务完成。

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
  • 调用Flowcollect方法开始执行操作流程,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
    1. 任务1完成时,任务2和任务3并发地执行
    1. 任务2完成时会并发地执行任务4, 任务3完成时会并发地执行任务5和任务6
    1. 任务5完成时会执行任务8, 当任务2和任务5都完成时会执行任务7,
    1. 任务7完成时会执行任务9, 任务7和任务8都完成时,会执行任务10
    1. 当所有任务都完成的时候,会收到complete消息,流程结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值