我有以下情况: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现在已经完成,现在我应该重新创建它们。是否有可能克隆作业并将其放入队列?
我的问题是:哪种解决方案是最好的解决方案?使用协程时,我有点迷失了。我的代码非常复杂,然后在这里描述,我只需要一些有关这种情况的准则,以及如何进行管理。协程之间如何通信?
任何想法都值得欢迎。谢谢!
答案 0 :(得分:0)
我会让job1和job2在它们的开头获取访问令牌(从redis或其他东西获取访问令牌)。然后,如果访问令牌过期,请启动job3以更新访问令牌,然后恢复所有作业。 我不知道您的工作人员和工作调度员是什么样子,但是开源世界中的许多实现都有延迟和重试失败工作的能力。如果您不具备此功能,则必须重新创建作业,而不必担心访问令牌,因为它将在作业开始时获取。
简短说明:请勿在源代码中对访问令牌进行硬编码。不要在作业数据中对访问令牌进行编码。只需在需要时获取所需的访问令牌。