根据Laravel事件文档,我的印象是我可以通过在侦听器上添加"实现ShouldQueue"来异步创建事件队列。
namespace AppListeners;
use Log;
use AppEventsMeetEntryConfirmationEvent;
use AppMailMeetEntryConfirmation;
use IlluminateContractsQueueShouldQueue;
class MeetEntryConfirmationListener implements ShouldQueue
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param MeetEntryConfirmationEvent $event
* @return void
*/
public function handle(MeetEntryConfirmationEvent $entryEvent)
{
Log::debug('Attempt to send MeetEntryConfirmationEvent');
// Do time consuming stuff
}
}
我的事件是这样实现的:
class MeetEntryConfirmationEvent extends Event
{
use SerializesModels;
public $entry;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(MeetEntry $entry)
{
$this->entry = $entry;
Log::debug('Created MeetEntryConfirmationEvent');
}
}
我像这样派遣他们。
event(new MeetEntryConfirmationEvent($entry));
我已经将QUEUE_DRIVER设置为数据库,作业表在那里。调度事件时,它似乎工作正常,因为它会立即返回。当我将其置于同步模式时,作业将需要 8 秒,因此不再发生这种情况。
但是,作业表中永远不会有一行,当我运行队列工作线程时,没有任何反应,作业不会执行。
我也尝试将配置/队列.php从Laravel复制到我的lumen应用程序中,但这似乎没有区别。当它在同步驱动程序中并且我不使用 ShouldQueue 时,这项工作确实曾经发生过。
所以我最终发现了问题所在。它归结为Lumen/Laravel手册中没有的细节。
您需要将其添加到具有服务提供商注册部分中的 Lumen 引导程序:
$app->configure('queue');
$app->register(IlluminateQueueQueueServiceProvider::class);