有没有一种方法可以在Laravel 8中实现,一个特定于用户的队列,包含在队列为空时激发事件的能力



我目前有一个导入进程,它将一系列作业分派到默认队列,这些作业由用户通过API输入启动。

如果我在调度时将用户id添加到队列名称中,它将进入特定于用户的队列,但我无法为该特定队列启动队列工作者。有没有任何方法可以通过编程方式启动队列:work命令来解决这个问题?

此外,我想在队列完成其工作后为单个用户发送一个广播信号。如果我能解决最初的问题,我最初的想法是在事件订阅者中实现发送信号,该订阅者监视特定于用户的队列。

我在这里找到了一条部分路线:在所有作业完成后轮询Laravel队列这并不能完全起作用,因为当队列为空时,它将继续触发。因此,一旦活动订阅者运行一次,我就必须想办法取消订阅。我还必须找到一种方法,在导入过程开始后,在运行时订阅事件订阅服务器,如Laravel官方文档中所述。https://laravel.com/docs/8.x/events#event-订户

一种方法可以是创建一个管理该队列的自定义表,然后向其添加/删除,并让循环事件订阅者遍历该表,检查队列是否在该表中,如果在,则检查其大小,如果为0,则发送广播信号,然后从表中删除。

以下是队列中已经存在的事件。https://laravel.com/api/8.x/Illuminate/Queue/Events/Looping.html

最好的方法是什么?

从开始到结束:用户提供了一个要导入的文件,我正在解释该文件,并调度处理数据的作业,一旦作业完成,就应该向该用户发送一个广播信号,表示导入完成。

您可能想要使用作业批次功能

它将允许您调度作业并在最后运行回调。以下是文档中的一个示例:

$batch = Bus::batch([
new ImportCsv(1, 100),
new ImportCsv(101, 200),
new ImportCsv(201, 300),
new ImportCsv(301, 400),
new ImportCsv(401, 500),
])->then(function (Batch $batch) {
// All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
// First batch job failure detected...
})->finally(function (Batch $batch) {
// The batch has finished executing...
})->dispatch();   

您可以在回调的末尾发送广播事件

最新更新