РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1359 of 1361 menu

Транспорт 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,
    который помечает класс как обработчик сообщений
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить