大家好的程序员,祝大家早上好。
情况
Laravel很棒。 Laravel Mail队列和beanstalkd集成非常棒。我几乎没有时间让一切正常。阳光灿烂,不下雨。太棒了。
除非在发送电子邮件时抛出异常。然后,一次又一次地处理此邮件,并且一次又一次地抛出异常。
无限循环。
我想如果我没有用无效数据播种数据库,我甚至不会注意到这一点。验证通常会照顾到这一点,像361FlorindaMatthäi@gmail.com这样的电子邮件最终不会得到以下例外:
[Swift_RfcComplianceException]
给出[361FlorindaMatthäi@gmail.com]的邮箱中的地址没有 符合RFC 2822,3.6.2。
但是,验证不会照顾的是,例如,当我的mandrill帐户达到其限制或我的服务器失去互联网连接时,无论如何。异常将其发送到无限循环。
在阳光灿烂,一切都很美好的世界里,工作必须被标记为埋葬或暂停,下一封电子邮件应该被处理。带有无效电子邮件地址的无限循环并不是很好。
基本上,您的应用程序不再发送任何电子邮件。这家伙大致相同issue。
我该如何解决这个问题?还有其他人遇到过此错误吗?
非常感谢任何帮助。
答案 0 :(得分:10)
在决定失败之前,您只需要多次前往Laravel尝试某项工作:
php artisan queue:daemon --tries=3
这样,它会在3次尝试后停止处理该特定作业。
答案 1 :(得分:1)
任何基于队列的系统的难点在于处理错误,我通过BeanstalkD运行了数千万个作业,还有更多通过SQS等其他系统运行。
有了这个Swift_RfcComplianceException
例外,很明显这项工作永远不会成功,所以再试一次将是徒劳的。
其他一些问题可能会被恢复,但在任何一种情况下,你都必须将代码包装在try / catch块中,然后尽你所能。
由于无法“修复”此特定问题,我会将发生的事件(例外的名称和任何消息以及数据)记录到要检查的日志中,然后delete
或bury
这份工作。如果您将job-id
存储在日志中,那么您可以稍后再返回delete
或kick
该特定作业 - 这是在能够更改发生的情况之后工作(而不是再次失败)。