Я хочу инициировать электронное письмо, когда новые строки добавляются в таблицу в моем приложении Laravel. Однако я хочу добавить своего рода буфер, поэтому, если 5 строк добавляются в быстрой последовательности, отправляется только 1 электронное письмо.
Метод, который я выбрал, заключается в том, чтобы запланировать проверку каждые 15 минут и посмотреть, добавлены ли новые строки. Если есть, то я поставлю в очередь электронное письмо.
В настоящее время я получаю сообщение об ошибке в расписании. Я прогоню свой код ниже:
В Kernel.php, где мы настраиваем расписания, у меня есть:
$schedule->job(new ProcessActivity)
->everyFifteenMinutes()
->when(function () {
return \App\JobItem::whereBetween('created_at', array(Carbon::now()->subMinutes(15), Carbon::now()))->exists();
})
->onSuccess(function () {
Log::debug(
'Success'
);
})
->onFailure(function () {
Log::debug(
'Fail'
);
});
Который я использую для запуска задания, найденного в: App\Jobs\ProcessActivity.php:
public function __construct()
{
$this->jobs = \App\JobItem::whereBetween('created_at', array(Carbon::now()->subMinutes(15), Carbon::now()))->get();
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Log::debug('Activity Job Run', ['jobs' => $this->jobs]);
$this->jobs->each(function ($item, $key) {
Log::debug('loop');
// get project
$project = $item->project;
// get project email
$user_id = $project->user_id;
$email = \App\User::find($user_id)->email;
// get project UUID
$projectUuid = $project->public_id;
// emails
$subscriberEmails = \App\ProjectSubscription::where('project_id', $project->id)->get();
// create activity email
Notification::route('mail', $subscriberEmails)->notify(new Activity($project, $projectUuid));
});
return true;
}
Я разместил свой полный код выше, который также показывает связь между моими моделями JobItems и Project. Я не буду подробно останавливаться на этом, поскольку я прокомментировал код.
Проблема
Когда я добавляю новую строку в свою таблицу JobItem, я вижу, что задание запланировано и обрабатывается (используя Laravel Telescope для проверки).
Однако я также вижу в своем журнале, что для каждого задания я получаю два сообщения журнала:
Сначала: «Ошибка», а затем «Выполнение задания активности».
Мое электронное письмо не отправляется, и я не знаю, как определить, почему это не удается.
Итак, кажется, что onFailure срабатывает, и есть проблема с моей ProcessActivity.
Любые подсказки о том, где я ошибаюсь и как определить ошибку, будут высоко оценены.