Класс StopWorkerException
Класс StopWorkerException находится в пространстве имён
Symfony\Component\Messenger\Exception и используется
для остановки воркера изнутри обработчика сообщения. Когда
исключение выбрасывается в методе __invoke обработчика,
воркер завершает обработку текущего сообщения и корректно
останавливается. Это удобно, когда нужно прервать бесконечный
цикл воркера по условию, например при достижении лимита
обработанных сообщений или при появлении специального
сигнального сообщения.
Синтаксис
<?php
use Symfony\Component\Messenger\Exception\StopWorkerException;
throw new StopWorkerException('message');
?>
Пример
Давайте создадим обработчик, который останавливает воркер после обработки сообщения:
<?php
namespace App\MessageHandler;
use App\Message\ArticleMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
use Symfony\Component\Messenger\Exception\StopWorkerException;
#[AsMessageHandler]
class ArticleHandler
{
public function __invoke(ArticleMessage $message): void
{
echo $message->getText();
throw new StopWorkerException('worker stopped');
}
}
?>
Результат выполнения кода при обработке сообщения с текстом
'abcde':
"abcde"
Пример
Давайте остановим воркер после обработки десяти сообщений:
<?php
namespace App\MessageHandler;
use App\Message\ArticleMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
use Symfony\Component\Messenger\Exception\StopWorkerException;
#[AsMessageHandler]
class ArticleHandler
{
private int $count = 0;
public function __invoke(ArticleMessage $message): void
{
$this->count++;
echo $message->getText();
if ($this->count >= 10) {
throw new StopWorkerException('limit reached');
}
}
}
?>
Результат выполнения кода после обработки десятого сообщения:
"worker stopped after 10 messages"
Смотрите также
-
класс
Worker,
который обрабатывает сообщения из очереди -
метод
run,
который запускает цикл обработки сообщений -
метод
stop,
который останавливает воркер извне -
класс
HandlerFailedException,
который выбрасывается при ошибке в обработчике