完成另一个作业后重新创建作业

时间:2019-04-12 08:49:08

标签: kotlin jobs coroutine

我有以下情况:job1和job2同时进入服务器,并且它们都以状态401返回,这意味着我的令牌访问已过期,需要刷新。我启动job3,它又返回了新令牌。在这种情况下,我必须根据请求使用新令牌重新创建job1和job2并启动它们。 我有一个jobDispatcher,但在某些情况下似乎没有帮助。这是:

class JobDispatcher : CoroutineDispatcher() {
  private val queue: Queue<Runnable> = LinkedList()
  private var isPaused: Boolean = false
  private var lastExecutedBlock: Runnable? = null

  @Synchronized
  override fun dispatch(context: CoroutineContext, block: Runnable) {
    if (isPaused) {
      queue.add(block)
    } else {
      thread {
        lastExecutedBlock = block
        block.run()
      }
    }
  }

  @Synchronized
  fun pause() {
    isPaused = true
    if (lastExecutedBlock != null) {
      queue.add(lastExecutedBlock)
      lastExecutedBlock = null
    }
  }

  @Synchronized
  fun resume() {
    isPaused = false
    runQueue()
  }
}

在job3启动之前调用暂停方法,当结果成功时,将调用resume方法。问题是job1和job2现在已经完成,现在我应该重新创建它们。是否有可能克隆作业并将其放入队列?

我的问题是:哪种解决方案是最好的解决方案?使用协程时,我有点迷失了。我的代码非常复杂,然后在这里描述,我只需要一些有关这种情况的准则,以及如何进行管理。协程之间如何通信?

任何想法都值得欢迎。谢谢!

1 个答案:

答案 0 :(得分:0)

我会让job1和job2在它们的开头获取访问令牌(从redis或其他东西获取访问令牌)。然后,如果访问令牌过期,请启动job3以更新访问令牌,然后恢复所有作业。 我不知道您的工作人员和工作调度员是什么样子,但是开源世界中的许多实现都有延迟和重试失败工作的能力。如果您不具备此功能,则必须重新创建作业,而不必担心访问令牌,因为它将在作业开始时获取。

简短说明:请勿在源代码中对访问令牌进行硬编码。不要在作业数据中对访问令牌进行编码。只需在需要时获取所需的访问令牌。