【问题标题】:Why are my Laravel failed jobs not showing up in the failed_jobs table?为什么我的 Laravel 失败的作业没有显示在 failed_jobs 表中?
【发布时间】:2022-02-14 11:45:43
【问题描述】:

我按照文档创建作业并在我的句柄()中强制失败:

throw new \Exception("Error Processing the job", 1);

结果是预期的失败作业,但失败的作业未显示在 failed_job 表中。处理时,它会显示在作业表中。

[2020-12-15 07:37:18][6] Processing: App\Jobs\IntroEmailJob
[2020-12-15 07:37:18][6] Failed:     App\Jobs\IntroEmailJob

Laravel 8.0

编辑: 在日志中找到了这个:

General error: 1364 Field 'uuid' doesn't have a default value

正如文档解释的那样,我创建了 failed_jobs 表:

php artisan queue:failed-table

php artisan migrate

【问题讨论】:

  • 只有在所有重试都用完后才会写入failed_jobs表,你允许重试多少次?你可以阅读更多关于它的信息here
  • 1 次尝试:(php artisan queue:work --tries=1)。表中仍然没有条目。顺便说一句,默认尝试次数是多少?
  • @mjpsr11 自 Laravel 6.0 以来的默认设置是尝试一次。旧版本的 Laravel 会无限期地尝试(尽管通常会在 255 次尝试后导致数据库值异常)。

标签: laravel


【解决方案1】:

我将 failed_jobs 表中的 uuid 字段默认更改为 Null,它现在可以正常工作了。

您需要在 ~/app/config/queue.php 文件中添加一个参数 driver,其值为 database-uuids

    'failed' => [
        'driver' => 'database-uuids',
        'database' => env('DB_CONNECTION', 'mysql'),
        'table' => 'failed_jobs',
    ],

Laravel 将使用 DatabaseUuidFailedJobProvider,它能够创建 UUID。

接下来您将使用php artisan queue:retry YOUR_UUID 来重试失败的作业。

【讨论】:

    【解决方案2】:

    我将 failed_jobs 表中的 uuid 字段默认更改为 Null,现在它可以正常工作了。

    谁能解释一下为什么 artisan 命令没有考虑到这一点以及 uuid 的用途?

    【讨论】:

    • 如果您升级了现有项目,但没有使 queue.php 配置文件与最新版本保持同步,然后在升级后 运行 artisan queue:failed-table,您可以结束处于您的配置没有'driver' => 'database-uuid' 的状态。基本上你有较新的数据库模式,但配置较旧,这使得 Laravel 尝试使用旧版本的某些行为(在添加 uuid 字段之前)。新项目不会遇到此问题,旧项目在升级之前(不更新配置)发布和迁移失败的作业也不会遇到此问题。
    • 我使用的是 Laravel 8.0。这是我的配置:'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids')
    • 您是否有可能在QUEUE_FAILED_DRIVER 环境变量中设置了某些内容,或者可能是缓存的配置? (php artisan config:clear)
    • 仔细阅读您的评论,我可能有这种情况。我确实将 Laravel 升级到 8.0,之后可以迁移队列表。
    【解决方案3】:

    QUEUE_FAILED_DRIVER 环境变量设置为database-uuids 将解决您的问题

    【讨论】:

    • 我相信这已经是变量留空时的默认值,这可能表明他们的配置文件没有设置driver字段根本,这这意味着它不检查 QUEUE_FAILED_DRIVER 变量。 laravel 附带的旧版本队列配置不包含驱动程序字段。
    【解决方案4】:

    我在使用 Laravel 8 时遇到了这个问题,失败作业的记录没有存储在“failed_jobs”表中。

    就我而言,问题是由于某种 UUID / ID 问题而没有存储记录。原来我的 failed_jobs 迁移来自 Laravel 7。

    您需要做的就是升级此迁移以匹配 Laravel 8 或替换此:

    $table->uuid('id')->primary();
    

    用这个:

    $table->id();
    

    【讨论】:

      猜你喜欢
      • 2023-02-16
      • 2012-07-02
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 2016-03-18
      相关资源
      最近更新 更多