DependencyTask 任务依赖框架

DependencyTask 任务依赖框架,第1张

DependencyTask 任务依赖框架 背景

在我们的程序中,经常会有序列的 *** 作流程集合,就像工厂的组装流程,先执行任务1,然后任务2,任务n…, 各个任务之间是有依赖关系的,比如,执行任务4之前,任务3和任务2要完成了才行。一个具体的例子,比如,app中的启动过程,一般包含权限检查,用户登录,引擎初始化等一系列的 *** 作,这些 *** 作有些可能有依赖关系,而且这些依赖关系随着需求的变化也可能发生变化,这里我们就可以使用下面介绍的 DepengdencyTask 任务依赖框架

框架特征
  • 框架可以检查任务的循环依赖
  • 没有依赖关系的任务可以并发的执行(可以指定任务执行的Disaptacher)
  • 一组任务执行器被调用多次,不会多次执行;只会从上一次执行失败的任务开始继续执行
  • 如果任务执行器在运行期间,会检查状态,正在运行时,不会再执行一遍。
引用 maven

  
    jitpack.io
    https://jitpack.io
  


  com.github.Arrowyi
  DependencyTask
  TheVersion

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 ")
      }
  }

}


更多的使用方法可以参考项目中的测试用例

任务执行示例


如上示例,任务2和任务3将会并发地执行,任务7会在任务2和任务5执行完成后才执行,当所有任务都完成的时候,会收到complete消息,流程结束。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/904806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-15
下一篇 2022-05-15

发表评论

登录后才能评论

评论列表(0条)

保存