Laravel运行事件在作业队列异步



在Laravel 9中,我有一个简单的Job,它在服务器上处理大量图像

class ExchangeJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct()
{

}
public function handle()
{
$ImageObject = new AppCoreImages;
$ImageObject->ProductsImagesRegenerate();
}
}
在内部,我调用一个队列来通知用户进程的进度。我使用推送器和订阅通知
public function ProductsImagesRegenerate(): void {

NoticeEvent::dispatch('Starting processing notice');
$images = array("red", "green", "blue", "yellow");

foreach ($images as $value) {
NoticeEvent::dispatch($value);
}

event(new NoticeEvent("End processing images"));
}

问题是事件是同步调用的。Job首先启动,它在后台运行。在作业执行期间,所有事件都被放置在某种队列中,直到作业完成才调用它们,然后触发它们。我需要Job在后台,并在执行期间接收推送器的通知。

php artisan queue:listen

现在Job首先完成,只有在它完成后,才开始执行事件通知。如何在后台工作时异步接收事件推送通知?

2022-12-10 20:45:41 AppJobsExchangeJob ........................... RUNNING
2022-12-10 20:45:55 AppJobsExchangeJob .................. 13,073.61ms DONE
2022-12-10 20:45:55 AppEventsNoticeEvent ......................... RUNNING
2022-12-10 20:45:55 AppEventsNoticeEvent ................... 333.14ms DONE
2022-12-10 20:45:56 AppEventsNoticeEvent ......................... RUNNING
2022-12-10 20:45:56 AppEventsNoticeEvent ................... 265.29ms DONE
2022-12-10 20:45:57 AppEventsNoticeEvent ......................... RUNNING
2022-12-10 20:45:57 AppEventsNoticeEvent ................... 294.35ms DONE
2022-12-10 20:45:58 AppEventsNoticeEvent ......................... RUNNING
2022-12-10 20:45:58 AppEventsNoticeEvent ................... 298.30ms DONE
2022-12-10 20:45:58 AppEventsNoticeEvent ......................... RUNNING
2022-12-10 20:45:59 AppEventsNoticeEvent ................... 276.32ms DONE
2022-12-10 20:45:59 AppEventsNoticeEvent ......................... RUNNING
2022-12-10 20:46:00 AppEventsNoticeEvent ................... 278.33ms DONE

看起来您的notifeevent与ExchangeJob在同一队列上排队。因为只有一个工作进程(php artisan queue:listen)在运行,它们不能并行执行。

尝试启动至少两个工作进程(在另一个终端上运行php artisan queue:listen)。此外,你应该为ExchangeJob和notifeevent使用单独的队列和工作者,以确保notifeevents不会被其他长时间运行的ExchangeJobs阻塞。

最新更新