Транспорт async
Транспорт async - это встроенный транспорт Symfony,
который используется для асинхронной обработки сообщений.
Он настраивается в файле config/packages/messenger.yaml
в секции framework.messenger.transports.
Сообщения, отправленные в этот транспорт, не обрабатываются
сразу, а помещаются в очередь и обрабатываются позже
отдельным процессом-воркером.
По умолчанию транспорт async работает через
Doctrine (таблица messenger_messages в базе данных),
но его можно переопределить на Redis, AMQP, Kafka
или другой брокер сообщений.
Синтаксис
framework:
messenger:
transports:
async:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
Пример
Давайте настроим транспорт async в файле конфигурации:
framework:
messenger:
transports:
async:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
routing:
'App\Message\SendEmailMessage': async
Теперь сообщение SendEmailMessage будет автоматически
отправляться в транспорт async.
Пример
Давайте создадим класс сообщения и отправим его в очередь:
<?php
namespace App\Message;
class SendEmailMessage
{
public function __construct(
private string $email,
private string $text
) {
}
public function getEmail(): string
{
return $this->email;
}
public function getText(): string
{
return $this->text;
}
}
?>
Теперь отправим сообщение через шину:
<?php
namespace App\Controller;
use App\Message\SendEmailMessage;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Routing\Attribute\Route;
class MessageController extends AbstractController
{
#[Route('/send', name: 'send_message')]
public function send(MessageBusInterface $bus): Response
{
$bus->dispatch(new SendEmailMessage('user', 'hello'));
return new Response('message sent');
}
}
?>
Результат выполнения кода:
"message sent"
Пример
Давайте создадим обработчик для этого сообщения:
<?php
namespace App\MessageHandler;
use App\Message\SendEmailMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler]
class SendEmailMessageHandler
{
public function __invoke(SendEmailMessage $message): void
{
echo 'Email: ' . $message->getEmail();
}
}
?>
Запустим воркер для обработки очереди:
php bin/console messenger:consume async
Результат выполнения кода:
"Email: user"
Смотрите также
-
класс
MessageBus,
который отправляет сообщения в шину -
метод
dispatch,
который отправляет сообщение в очередь -
класс
Worker,
который обрабатывает сообщения из очереди -
атрибут
AsMessageHandler,
который помечает класс как обработчик сообщений