Laravel 5.5队列和作业:作业从未执行

问题描述 投票:0回答:1

我对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:listenphp 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未被实例化,但我看到显示的构造函数消息有点奇怪。

laravel queue jobs lumen
1个回答
0
投票

@ alex QUEUE_CONNECTION=database将此放入您的环境中,而您的queue.php是

'sync' => [
            'driver' => 'sync',
        ],

        'database' => [
            'driver' => 'database',
            'table' => 'jobs',
            'queue' => 'default',
            'retry_after' => 90,
        ],

© www.soinside.com 2019 - 2024. All rights reserved.