frutality / laravel-bounceable-job
用于在 Laravel 中创建可重试的队列任务的软件包
v1.0.0
2019-05-09 12:36 UTC
Requires
- php: >=7.1
- laravel/framework: ~5.6.0|~5.7.0|~5.8.0
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
];
}