Метод cancel
Метод cancel используется для отмены выполнения пакетной задачи
в очереди Laravel. Он применяется к экземпляру класса Batch
и позволяет остановить обработку всех заданий в пакете,
которые ещё не были выполнены. Метод не принимает параметров
и возвращает void.
Синтаксис
<?php
$batch->cancel();
?>
Пример
Давайте создадим пакет заданий и отменим его выполнение:
<?php
namespace App\Http\Controllers;
use App\Jobs\ProcessDataJob;
use App\Jobs\SendNotificationJob;
use App\Jobs\UpdateDatabaseJob;
use Illuminate\Support\Facades\Bus;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Log;
class BatchController extends Controller
{
public function createBatch()
{
$batch = Bus::batch([
new ProcessDataJob(),
new SendNotificationJob(),
new UpdateDatabaseJob(),
])->then(function (Batch $batch) {
Log::info('All jobs completed');
})->catch(function (Batch $batch, $e) {
Log::error('Batch failed: ' . $e->getMessage());
})->finally(function (Batch $batch) {
Log::info('Batch finished');
})->dispatch();
return $batch->id;
}
}
?>
Пример
Отменим пакетную задачу по её ID:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Bus;
use Illuminate\Bus\Batch;
use Illuminate\Http\Request;
class BatchController extends Controller
{
public function cancelBatch(Request $request)
{
$batchId = $request->input('batch_id');
$batch = Bus::findBatch($batchId);
if ($batch) {
$batch->cancel();
return response()->json([
'message' => 'Batch cancelled successfully'
]);
}
return response()->json([
'message' => 'Batch not found'
], 404);
}
}
?>
Пример
Проверим статус пакета до и после отмены:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Bus;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Log;
class BatchController extends Controller
{
public function checkBatchStatus($batchId)
{
$batch = Bus::findBatch($batchId);
if (!$batch) {
return 'Batch not found';
}
$res = [
'id' => $batch->id,
'pending' => $batch->pending(),
'processed' => $batch->processed(),
'progress' => $batch->progress(),
'canceled' => $batch->canceled()
];
if ($batch->pending() && !$batch->canceled()) {
$batch->cancel();
$res['status'] = 'Cancelled';
}
return $res;
}
}
?>
Пример
Отменим пакет с проверкой на возможность отмены:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Bus;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Log;
class BatchController extends Controller
{
public function safeCancelBatch($batchId)
{
$batch = Bus::findBatch($batchId);
if (!$batch) {
return 'Batch not found';
}
if ($batch->processed()) {
Log::warning('Batch already processed, cannot cancel');
return 'Batch already processed';
}
if ($batch->canceled()) {
Log::info('Batch already canceled');
return 'Batch already canceled';
}
$batch->cancel();
Log::info('Batch canceled successfully');
return 'Batch canceled';
}
}
?>