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