【问题标题】:Recreate job after another job is completed另一个作业完成后重新创建作业
【发布时间】:2019-09-02 23:50:39
【问题描述】:

我遇到如下情况:job1和job2同时访问服务器,返回状态为401,表示我的token访问已过期,需要刷新。我启动了返回新令牌的 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启动之前调用pause方法,结果成功后调用resume方法。问题是 job1 和 job2 现在已经完成,现在我应该重新创建它们。是否有可能克隆作业并将其放入队列中?

我的问题是:解决这个问题的最佳解决方案是什么?在使用协程时,我有点迷茫。我的代码比我在这里描述的要复杂得多,我只需要一些针对这种情况的指导,如何管理它。协程之间如何通信?

欢迎任何想法。谢谢!

【问题讨论】:

    标签: kotlin jobs coroutine


    【解决方案1】:

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

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

    【讨论】:

    • job3完成后,将token保存在本地存储中。在创建请求时,从本地存储 job1 和 job2 获取它。我的问题是如何在协程之间进行通信; job1 和 job2 不知道 job3 何时完成。
    • 如果 job3 将在短时间内完成,那么只需将 job1 和 job2 再延迟几秒钟。如果没有,只需使用另一个协程定期检查。
    • 由于您将令牌保存在本地存储中,您还可以将令牌上次更新时间和作业失败时间保存在本地存储中。比较这两个时间戳,你就知道访问令牌是更新了还是过期了。
    • 我认为这不是一个好主意。我在这里命名了 job1 和 job2,但在我的代码中我有 9 个工作,所有工作都用 401 代码完成。必须有办法重试它们,然后 job3 完成。
    • 我用这种方法处理了很多作业,每秒几个。为什么这不是一个好主意?好的,还有一种方法,如果你能知道访问令牌会过期多久,你可以提前更新一下。
    猜你喜欢
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 2010-11-29
    • 2011-09-27
    相关资源
    最近更新 更多