如何实现重启通知任务时仅发送24小时内的待处理通知?
解决重启通知任务时仅发送24小时内待处理通知的问题
嘿,这个需求太接地气了——谁也不想打开邮箱看到一堆过期的时效性通知!咱们可以从几个关键环节入手修改逻辑,确保重启通知任务时,只有24小时内生成的待处理通知会被发送,旧通知直接跳过。
1. 先给通知记录加上时间标记
首先,你的待处理通知(比如示例里的候选人入职文档通知)得有个生成时间字段,比如created_at或者notification_generated_at,用来精准判断通知是否在有效期内。这是一切过滤逻辑的基础,别忘啦。
2. 任务重启时先过滤再分发
当通知任务因故重启(比如队列挂了之后重新启动、失败重试),不要一股脑把所有待处理通知都丢去执行,先筛选出生成时间不超过24小时的记录,再分发任务。
举个PHP/Laravel的例子,假设你从数据库获取待处理的候选人:
// 只筛选24小时内生成的、待发送入职通知的候选人 $recentPendingCandidates = Candidate::where('needs_onboarding_notification', true) ->where('created_at', '>=', now()->subHours(24)) ->get(); // 遍历分发任务 foreach ($recentPendingCandidates as $candidate) { $this->dispatch(new SendOnboardingDocs($candidate)); }
3. 任务执行时再加一层校验(双重保险)
怕万一?比如任务在队列里卡了超过24小时才被执行?那就在SendOnboardingDocs任务的执行方法里再加一次校验,确保万无一失:
class SendOnboardingDocs implements ShouldQueue { protected $candidate; public function __construct(Candidate $candidate) { $this->candidate = $candidate; } public function handle() { // 执行发送前先检查:候选人的通知生成时间是否在24小时内 if ($this->candidate->created_at->lessThan(now()->subHours(24))) { // 过期了,标记为已处理,直接返回不发送 $this->candidate->update(['needs_onboarding_notification' => false]); return; } // 这里写实际的发送逻辑,比如发邮件 Mail::to($this->candidate->email)->send(new OnboardingDocsMail($this->candidate)); // 标记通知已发送 $this->candidate->update(['needs_onboarding_notification' => false]); } }
4. 额外优化:给队列任务设置过期时间
如果用的是Laravel这类带队列功能的框架,还能直接给任务设置过期时间,让超过24小时的任务自动失效,连执行环节都不用进:
public function __construct(Candidate $candidate) { $this->candidate = $candidate; // 设置任务24小时后过期,过期后队列会自动丢弃它 $this->expiresAt = now()->addHours(24); }
这套组合拳下来,不管是批量重启任务时的筛选,还是单个任务的延迟执行,都能牢牢把住时效性的关,再也不会出现用户收到一堆旧通知的尴尬情况啦。
内容的提问来源于stack exchange,提问作者Sergey Harini
相关产品推荐
相关产品推荐

