我想在我的 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 有问题。
任何关于我哪里出错以及如何确定错误的线索将不胜感激。