Laravel 5.5 Очереди и задания: задание никогда не выполняется - PullRequest
0 голосов
/ 26 февраля 2020

Я довольно новичок в Lumen (Laravel), и в настоящее время я копаю концепцию очередей, заданий и запланированных задач.

Я хотел бы сохранить в очереди некоторые модели Eloquent, когда я получаю их от вызовов API. Затем я хочу создать запланированное задание, которое запускает ежедневное задание, выбрать все эти модели в очереди и затем отправить отчет по электронной почте.

Я пошел по пути хранения базы данных для очередей. Поэтому я добавил ключ QUEUE_DRIVER=database в свой файл .env и свою очередь. Файл конфигурации 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 при получении в конструкторе? для меня метод 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
            ])
        );
    }
}

И в моем Ядре. php я добавил следующую строку в расписание функций ():

   // everyMinute for test purposes only
   $schedule->job(new SendDeliveryEmailJob())->everyMinute();

Как Я использую Lumen, у меня нет точно такого же процесса, как в чистом Laravel, поэтому, когда я получаю заказ на доставку для вызова моей отправки, я пробовал оба способа, выставленные Lumen, сделать c (принудительно создать экземпляр моей работы):

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 секунды. Я также поместил журнал в функцию дескриптора, но никогда не вижу, чтобы он вызывался.

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

Я предполагаю из этого сообщения, что мое задание не является экземпляром, но я вижу сообщение конструктора, которое выглядит довольно странно ..

1 Ответ

0 голосов
/ 26 февраля 2020

@ alex QUEUE_CONNECTION=database поместите это в вашу среду и очередь. php is

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

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

...