在作业中暂停队列

Posted

技术标签:

【中文标题】在作业中暂停队列【英文标题】:Pause Queue in a Job 【发布时间】:2018-07-07 12:11:08 【问题描述】:

我有以下问题需要解决:

多个用户可以通过 Web 界面将作业提交到队列。 然后通过数据库队列驱动程序将这些作业存储在数据库中。

现在我的问题是:我希望队列运行所有作业,直到在作业内部我说 $queue->pause() 之类的东西,因为要运行下一个作业,我需要用户的确认。

我该如何做这样的事情?

运行作业 在一项作业中,作业确定它需要用户确认 暂停队列并将需要确认的作业保留在队列中 网站上的任何用户都可以按下按钮,然后删除此确认作业并重新启动队列。

我目前不起作用的“解决方案”是这样的: 创建 2 种不同的工作类型:

图像处理作业 UserNotificaitonJob

队列处理所有 ImageProcessingJobs,直到遇到 UserNotificationJob。 在 UserNotificationJob->handle() 中,我调用了 Artisan::call("queue:restart");这停止了​​队列。 这个解决方案的问题是: UserNotificationJob 也被删除了。因此,如果我再次启动队列,队列将立即从剩余的 ImageProcessingJobs 开始,而无需等待实际确认。

我也愿意接受其他没有队列系统的架构解决方案。

【问题讨论】:

您能否澄清一下,因此您希望用户确认停止所有作业,即使对于其他用户也是如此? 没错,是的。然后其中一位用户可以确认通知,然后作业再次开始运行 【参考方案1】:

避免暂停队列的一种方法是在 SyncEvent 上设置 UserNotificationJob wait(当用户返回确认时设置 SyncEvent)。如果您愿意,您可以让这个等待超时,但是您需要将作业重新发布到队列中。如果您决定超时并重新发布,您可以使用作业链来设置作业之间的依赖关系,这样在 UserNotificationJob 竞争之前什么都不能运行。

另一种方法可能是在用户发送确认之前避免发布剩余的工作。

【讨论】:

感谢 SyncEvent-Idea - 以前从未听说过这个!与此同时,我采用了你的第二种方法,它似乎效果很好。

以上是关于在作业中暂停队列的主要内容,如果未能解决你的问题,请参考以下文章

VB NET 如何暂停打印机队列?

如何在不清除整个队列的情况下从 Resque 队列中删除特定作业?

如何暂停 Spark 集群上的作业以及如何恢复它?

在特定队列上运行 sqoop 作业

Beanstalkd 在伪造队列工作人员上同时运行队列中的所有作业

管道符和作业控制