我对Lumen(Laravel)并不陌生,我目前正在研究队列,作业和计划任务的概念。
当我从API调用接收到一些雄辩的模型时,我希望将它们存储在队列中。然后,我想创建一个计划任务,该任务运行一个日常作业,以在Queue中获取所有这些模型,然后发送报告电子邮件。
我去了队列的数据库存储方式。因此,我在[env]文件中添加了QUEUE_DRIVER=database
键,而我的queue.php配置文件如下所示:
<?php
return [
'database' => [
'connection' => 'my_db_connection',
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 90
]
];
我运行了php artisan queue:table
命令来创建迁移文件,并运行了迁移来创建我的表。我有一个表格作业,具有正确的预期字段。
我创建了一个类,实现了ShouldQueue:
class ProcessDeliveryOrders implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $deliveryOrder;
public function __construct($deliveryOrder)
{
$this->deliveryOrder = $deliveryOrder;
}
public function handle()
{
// $this->deliveryOrder->save(); ?
}
}
这里是关于此类的工作原理的子问题:当它在构造函数中接收到Eloquent模型时,是否可以自动存储Eloquent模型?对我来说,Job检索对象时会调用handle方法,但是我可能会错,它用于存储对象?
然后,我创建了一个MailingJob:它的目标是汇总每天存储的所有ProcessDeliveryOrders,并从中创建一封电子邮件:
class SendDeliveryEmailJob extends Job
{
public function __construct()
{
//
}
public function handle()
{
// DeliveryOrder is my Eloquent Model
$deliveryOrders = DeliveryOrder::query()
->whereBetween('createdAt', [strtotime('today midnight'), strtotime('today midnight')])
->get();
$mail = Mail::to(config('admin.emails'));
$mail->send(
new DeliveryOrderReportMailTemplate([
'deliveryOrders' => $deliveryOrders
])
);
}
}
并且在我的Kernel.php中,我在函数schedule()中添加了以下行:
// everyMinute for test purposes only
$schedule->job(new SendDeliveryEmailJob())->everyMinute();
[当我使用Lumen时,我没有与纯Laravel中完全相同的过程,因此,当我收到交货订单以调用我的调度时,我尝试了Lumen文档公开的两种方法(强制创建一个实例我的工作):
dispatch(new ProcessDeliveryOrders($deliveryOrder));
// OR
Queue::push(new ProcessDeliveryOrders($deliveryOrder));
完成所有这些设置后,我尝试了一些命令,例如php artisan queue:listen
或php artisan queue:work
,并且命令行似乎卡住了。
如果运行php artisan queue:listen database
,则会出现以下循环错误:
在QueueManager.php第172行:
[没有连接器]
我检查了两次文档,并尝试了新的密钥QUEUE_CONNECTION=database
而不是QUEUE_DRIVER
,但显然仅从5.7开始,并且也没有起作用。有机会发现我想念的东西吗?非常感谢
EDIT:当我将日志记录到SendDeliveryEmailJob构造函数中时,我run php artisan queue:listen
,每隔2或3秒就会看到回显输出。我还把一个日志放到handle函数中,但是我从未见过这样的日志。
EDIT 2:我注意到当我尝试使用php artisan scheduled:run
执行计划的任务时,会引发错误:
Running scheduled command: App\Jobs\SendDeliveryEmailJob
In Schedule.php line 87:
Call to a member function onQueue() on null
我从此消息中猜测,我的Job未被实例化,但我看到显示的构造函数消息有点奇怪。
@ alex QUEUE_CONNECTION=database
将此放入您的环境中,而您的queue.php是
'sync' => [
'driver' => 'sync',
],
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 90,
],