Laravel 异常时邮件队列无限循环

Laravel Mail Queue Infinite Loop on Exception

各位程序员大家好,祝大家早上好。

情况

Laravel 很棒。 Laravel 邮件队列和 beanstalkd 集成很棒。我几乎没花时间就搞定了一切。阳光明媚,没有下雨。厉害了。

发送邮件时抛出异常除外。然后这个邮件一次又一次的处理,异常也是一次又一次的抛出。

无限循环。

我想如果我没有在数据库中植入无效数据,我什至不会注意到这一点。验证通常会解决这个问题,像 361FlorindaMatthäi@gmail.com 这样的电子邮件不会以以下异常结束:

[Swift_RfcComplianceException]
Address in mailbox given [361FlorindaMatthäi@gmail.com] does not comply with RFC 2822, 3.6.2.

但是验证不会注意的是,例如,当我的 mandrill 帐户达到其限制或我的服务器断开互联网连接时,等等。异常将其发送到无限循环中。

在阳光明媚、一切美好的世界里,工作必须被标记为埋没或暂停,并且应该处理下一封电子邮件。使用无效电子邮件地址的无限循环不是很好。

基本上您的应用程序不再发送任何电子邮件。这家伙也差不多issue.

我该如何解决这个问题?还有其他人遇到过这个错误吗?

非常感谢任何帮助。

您只需要旅行 Laravel 次尝试特定的工作,然后再决定它失败:

php artisan queue:daemon --tries=3

这样,它将在尝试 3 次后停止处理该特定作业。

任何基于队列的系统的困难部分都是处理错误,我已经 运行 通过 BeanstalkD 完成了数千万个作业,并且通过 SQS 等其他系统完成了更多作业。

有了这个 Swift_RfcComplianceException 异常,很明显作业永远无法成功,因此再次尝试将是徒劳的。

其他一些问题可能可以恢复,但无论哪种情况,您都必须将代码包装在 try/catch 块中并尽力而为。

由于无法'fix'这个特定问题,我会将发生的事情(异常名称和任何消息以及数据)记录到日志中以供检查,然后deletebury 作业。如果您在 job-id 被掩埋时将其存储在日志中,您可以返回并稍后再次 deletekick 该特定作业 - 这将是在能够更改发生的事情之后工作(而不是让它再次失败)。