1

我正在使用 laravel 4.2 开发一个项目,并且我正在将作业发送到 beanstalk 队列。当工作人员选择要执行的作业时,我试图捕获作业的 id,并在作业失败时将其关联回 failed_jobs 表。

问题是从Pheanstalk_Job->getId()方法返回的 id 永远不会与表中条目的 id 匹配failed_jobs

我可能会冒昧地认为这两者是相关的。如果没有,那么希望有人可以帮助我如何捕获与工作相关的 failed_jobs 记录的 id。

4

1 回答 1

0

最终,我在导致作业失败的异常与表中创建的条目之间创建关联的解决方案failed_jobs涉及以下步骤:

  1. 创建了一个迁移,该迁移创建了一个异常表,其中包括异常字段,即异常消息、代码、文件、行,以及 beanstalkd 作业 ID 的字段。
  2. 创建了一个完全按照 laravel 提供的 failed_jobs 模式建模的迁移,并添加了另一个字段,也就是 beanstalkd 作业 ID。
  3. 创建了我自己的 QueueServiceProvider 并将'queue.failer'服务'queue.worker'与我自己的实现绑定。我的“失败者”实现扩展了Illuminate\Queue\Failed\DatabaseFailedJobProvider并简单地添加了一个方法来执行包含 beanstalkd 作业 ID 的插入。我的“工人”实现扩展Illuminate\Queue\Worker并覆盖了logFailedJob调用我自己失败的作业插入方法的方法。
  4. app/config/queue.php我包括的内容中,'failed' => ['database' => 'mysql', 'table' => 'exception_failed_jobs']告诉 laravel 使用我自己的名为“exception_failed_jobs”的失败作业表。
  5. 在我的作业处理程序代码中,fire 方法将我的业务逻辑包装在 try/catch 中,并且引发的任何异常都将导致异常存储在我的异常表中,包括 beanstalkd 作业 ID。

现在所有引发的异常都通过作业 ID 与失败的作业记录相关联。企业现在可以确定导致作业失败的异常,并决定是纠正潜在问题并重试失败的作业,还是干脆将其从队列中删除。我已经测试了这个解决方案,它完全按照我的需要工作。希望这可以帮助其他有相同要求的人。

迫不及待地将这个项目从 4.2 迁移到最新版本。我知道最新的 laravel 已经有了这个功能:)

于 2016-04-03T18:01:52.467 回答