Класс Worker
Класс Worker запускает бесконечный цикл обработки сообщений из транспорта очереди.
Он принимает сообщения из указанного транспорта, передаёт их шине MessageBus
для выполнения и повторяет цикл до остановки. Первым параметром в конструктор передаётся
массив транспортов, вторым - шина, третьим - логгер. Обычно класс используется
внутри консольной команды messenger:consume, но его можно применять и напрямую.
Синтаксис
public function __construct(
iterable $receivers,
MessageBusInterface $bus,
?LoggerInterface $logger = null,
)
Пример
Давайте создадим воркер и обработаем одно сообщение из транспорта 'async':
<?php
namespace AppService;
use SymfonyComponentMessengerMessageBusInterface;
use SymfonyComponentMessengerTransportReceiverInterface;
use SymfonyComponentMessengerWorker;
use PsrLogLoggerInterface;
class WorkerExample
{
public function __construct(
private ReceiverInterface $receiver,
private MessageBusInterface $bus,
private LoggerInterface $logger,
) {
}
public function process(): void
{
$worker = new Worker(
[$this->receiver],
$this->bus,
$this->logger,
);
$worker->run([
'sleep' => 1000000,
]);
}
}
?>
В консоль будет выведена информация об обработанных сообщениях.
Пример
Давайте создадим воркер и досрочно остановим его через метод stop:
<?php
namespace AppService;
use SymfonyComponentMessengerMessageBusInterface;
use SymfonyComponentMessengerTransportReceiverInterface;
use SymfonyComponentMessengerWorker;
class WorkerStop
{
public function __construct(
private ReceiverInterface $receiver,
private MessageBusInterface $bus,
) {
}
public function process(): void
{
$worker = new Worker(
[$this->receiver],
$this->bus,
);
$worker->stop();
$worker->run();
}
}
?>
Результат выполнения кода:
"worker stopped"
Пример
Давайте получим метаданные о работе воркера через метод getMetadata:
<?php
namespace AppService;
use SymfonyComponentMessengerMessageBusInterface;
use SymfonyComponentMessengerTransportReceiverInterface;
use SymfonyComponentMessengerWorker;
class WorkerMetadata
{
public function __construct(
private ReceiverInterface $receiver,
private MessageBusInterface $bus,
) {
}
public function process(): array
{
$worker = new Worker(
[$this->receiver],
$this->bus,
);
return $worker->getMetadata();
}
}
?>
Результат выполнения кода:
["idle", "running", "stopped"]
Смотрите также
-
метод
run,
который запускает цикл обработки сообщений -
метод
stop,
который останавливает работу воркера -
метод
getMetadata,
который возвращает метаданные воркера -
класс
MessageBus,
который передаёт сообщения обработчикам