Атрибут maxExceptions
Атрибут maxExceptions класса Job позволяет задать лимит на количество исключений,
которые могут быть выброшены в процессе выполнения задания. Если задание выбрасывает
исключения чаще, чем указано в атрибуте, оно будет считаться неудавшимся и помещено
в очередь неудавшихся заданий. Это полезно для предотвращения бесконечных повторных
попыток в случае постоянных ошибок.
Синтаксис
Атрибут объявляется как публичное свойство класса Job.
<?php
class ProcessPodcast implements ShouldQueue
{
public $maxExceptions = 3;
}
?>
Пример
Давайте создадим задание, которое будет выбрасывать исключение при каждой попытке выполнения, и ограничим количество таких исключений тремя:
<?php
namespace AppJobs;
use AppModelsPodcast;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;
class ProcessPodcast implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, SerializesModels;
public $maxExceptions = 3;
protected $podcast;
public function __construct(Podcast $podcast)
{
$this->podcast = $podcast;
}
public function handle()
{
throw new \Exception('Processing error');
}
}
?>
Пример
Теперь отправим задание в очередь и посмотрим, сколько раз оно будет выполнено перед тем, как будет помечено как неудавшееся:
<?php
namespace AppHttpControllers;
use AppJobsProcessPodcast;
use AppModelsPodcast;
class PodcastController extends Controller
{
public function process()
{
$podcast = Podcast::first();
ProcessPodcast::dispatch($podcast);
echo "Job dispatched";
}
}
?>
После выполнения кода задание будет повторно запущено три раза, каждый раз выбрасывая исключение. На четвёртый раз оно будет помещено в таблицу неудавшихся заданий.
Пример
Давайте рассмотрим более сложный пример, где задание выполняет внешний запрос и может выбрасывать разные исключения:
<?php
namespace AppJobs;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
use IlluminateQueueInteractsWithQueue;
use IlluminateQueueSerializesModels;
use IlluminateSupportFacadesLog;
class FetchExternalData implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, SerializesModels;
public $maxExceptions = 2;
public function handle()
{
$client = new \GuzzleHttp\Client();
try {
$response = $client->get('https://api.example.com/data');
$data = json_decode($response->getBody(), true);
Log::info('Data fetched successfully', $data);
} catch (\Exception $e) {
Log::error('Fetch error: ' . $e->getMessage());
throw $e;
}
}
}
?>
В этом примере, если внешний API недоступен, задание будет повторяться до двух раз. После третьего исключения оно будет признано неудавшимся.