frutality/laravel-bounceable-job

用于在 Laravel 中创建可重试的队列任务的软件包

v1.0.0 2019-05-09 12:36 UTC

This package is auto-updated.

Last update: 2024-09-10 01:13:53 UTC


README

用于在 Laravel 中创建可重试的队列任务的软件包。

安装

composer require frutality/laravel-bounceable-job

原因

我们的 Jobs 常常试图连接不工作的远程 API。失败是不可避免的。通常我们希望在这些作业失败时重试多次,以防 API 重新上线。

默认情况下,Laravel 提供了立即重试失败作业多次的功能(请参阅 文档)。

但在大多数情况下,立即重试也会失败,因为 API 需要一些时间才能恢复正常。我们可能希望增加每次失败尝试后的延迟。

示例

<?php

namespace App\Jobs;

use App\Something;
use App\Services\SomeService;
use Frutality\BounceableJob\Contracts\BounceableJob;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class SentSomethingToAPI extends BounceableJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
    protected $something;
    
    /**
     * Create a new job instance.
     *
     * @param Something $something
     */
    public function __construct(Something $something)
    {
        parent::__construct($something); // required
        $this->something = $something;
    }
    
    /**
     * This is the only required method. 
     * sentToAPI method may throw an exception. And if it throws - BounceableJob do all the work
     * @throws Exception
     */
    public function doWork(): void
    {
        $service = new SomeService();
        $service->sentToAPI($this->something);
    }
}

配置

默认情况下,如果作业失败,它将在 1 分钟后重试。如果这次尝试也失败了,下一次将在 5 分钟后重试。下一次在 30 分钟后。最后一次在 1 小时后。

如果您需要调整这些值,只需定义自己的 getAttemptsDelays 方法,例如

public function getAttemptsDelays(): array
{
    return [
        2 * 60, // 2 minutes
        15 * 60, // 15 minutes
        60 * 60, // 60 minutes etc
    ];
}