Laravel队列任务默认重试1次(共执行2次),可通过任务类$tries属性、@Retry注解、Horizon配置或dispatch时tries()方法自定义重试次数,优先级从高到低为:调度时指定>任务类$tries>Horizon配置>全局。

在 Laravel 中,队列任务失败后的重试次数默认为 1 次(即最多执行 2 次:首次 + 1 次重试),但你可以通过多种方式自定义这个行为。
在任务类中设置 $tries 属性
这是最常用、最直接的方式。在你的队列任务类(例如 app/Jobs/ProcessPodcast.php)中,定义 $tries 属性:
-
public $tries = 3;表示该任务最多尝试 3 次(首次执行 + 2 次重试) - 若设为
0,表示不重试(失败后直接进入 failed_jobs 表) - 该设置会覆盖全局配置,优先级最高
使用 @retry 注解(PHP 8+)
如果你使用 PHP 8 或更高版本,可以在任务的 handle 方法上使用注解:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
-
#[Retry(5)]表示最多执行 5 次 - 需确保已启用 Laravel 的注解支持(Laravel 9.28+ 原生支持)
- 效果等同于设置
$tries,但更贴近方法逻辑
配置全局默认重试次数
修改 config/queue.php 中的 failed 配置项无法控制重试次数,真正影响重试的是队列驱动的行为。但你可以:
- 在
config/queue.php的对应连接(如redis或database)下,不直接设重试数,而是依赖任务类或调度时指定 - 若使用 Horizon,可在
config/horizon.php的defaults或environments中设置:'tries' => 3, - Horizon 的配置会作用于匹配的队列,优先级介于全局和任务类之间
调度任务时动态指定重试次数
在分发任务时,可用 onQueue()、delay() 等链式方法配合 tries()(Laravel 9.23+):
ProcessPodcast::dispatch($podcast)->tries(4);- 这会临时覆盖任务类中的
$tries值 - 适合不同业务场景需要差异化重试策略的情况

















