Метод stop класса Worker
Метод stop класса Worker
устанавливает флаг остановки воркера. После вызова
этого метода воркер завершает обработку текущего
сообщения и корректно останавливается, не забирая
новые сообщения из транспорта. Метод принимает
один параметр $returnCode - код возврата,
который будет возвращён из метода run.
Синтаксис
public function stop(int $returnCode = 0): void
Пример
Давайте остановим воркер после обработки первого сообщения:
<?php
namespace AppMessageHandler;
use AppMessageArticleMessage;
use SymfonyComponentMessengerHandlerMessageHandlerInterface;
use SymfonyComponentMessengerWorker;
class ArticleMessageHandler implements MessageHandlerInterface
{
private Worker $worker;
public function __construct(Worker $worker)
{
$this->worker = $worker;
}
public function __invoke(ArticleMessage $message): void
{
echo $message->getText();
$this->worker->stop();
}
}
?>
После обработки первого сообщения воркер завершит работу.
Пример
Давайте остановим воркер с кодом возврата 1
при возникновении ошибки:
<?php
namespace AppMessageHandler;
use AppMessageArticleMessage;
use SymfonyComponentMessengerHandlerMessageHandlerInterface;
use SymfonyComponentMessengerWorker;
class ArticleMessageHandler implements MessageHandlerInterface
{
private Worker $worker;
public function __construct(Worker $worker)
{
$this->worker = $worker;
}
public function __invoke(ArticleMessage $message): void
{
try {
$res = $message->process();
echo $res;
} catch (Exception $e) {
$this->worker->stop(1);
}
}
}
?>
Если при обработке сообщения возникнет исключение,
воркер остановится и вернёт код 1.
Пример
Давайте запустим воркер вручную и остановим его через некоторое время:
<?php
namespace AppCommand;
use SymfonyComponentConsoleCommandCommand;
use SymfonyComponentConsoleInputInputInterface;
use SymfonyComponentConsoleOutputOutputInterface;
use SymfonyComponentMessengerTransportReceiverInterface;
use SymfonyComponentMessengerWorker;
class WorkerCommand extends Command
{
protected static $defaultName = 'app:worker';
public function __construct(
private ReceiverInterface $receiver,
private Worker $worker
) {
parent::__construct();
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$output->writeln('Worker started');
$this->worker->stop();
$res = $this->worker->run();
return $res;
}
}
?>
Результат выполнения кода:
"Worker started"
Смотрите также
-
класс
Worker,
который обрабатывает сообщения из транспорта -
метод
run,
который запускает обработку сообщений -
метод
getMetadata,
который возвращает метаданные воркера -
исключение
StopWorkerException,
которое останавливает воркер из обработчика