Транспорт sync
Транспорт sync - это встроенный транспорт Symfony Messenger,
который выполняет обработку сообщения немедленно, прямо во время
вызова метода dispatch. Сообщение не попадает в очередь и не
требует запуска воркера. Транспорт удобен для отладки, а также
для задач, которые должны быть выполнены синхронно в рамках
текущего запроса. В конфигурации он задаётся секцией
framework.messenger.transports.sync.
Синтаксис
framework:
messenger:
transports:
sync: 'sync://'
Пример
Давайте настроим транспорт sync в конфигурации Messenger:
framework:
messenger:
transports:
sync: 'sync://'
Теперь отправим сообщение в этот транспорт через атрибут AsMessageHandler
и метод dispatch:
<?php
namespace App\Message;
class ArticleMessage
{
public function __construct(
public string $text,
) {
}
}
?>
<?php
namespace App\MessageHandler;
use App\Message\ArticleMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler]
class ArticleMessageHandler
{
public function __invoke(ArticleMessage $message): void
{
echo $message->text;
}
}
?>
<?php
namespace App\Controller;
use App\Message\ArticleMessage;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index')]
public function index(MessageBusInterface $bus): Response
{
$bus->dispatch(new ArticleMessage('hello'));
return new Response('sent');
}
}
?>
Результат выполнения кода:
"hello"
Пример
Давайте явно укажем транспорт sync при отправке сообщения
через стамп TransportNamesStamp:
<?php
namespace App\Controller;
use App\Message\ArticleMessage;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Messenger\Stamp\TransportNamesStamp;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/', name: 'article_index')]
public function index(MessageBusInterface $bus): Response
{
$bus->dispatch(
new ArticleMessage('abcde'),
[new TransportNamesStamp(['sync'])]
);
return new Response('done');
}
}
?>
Результат выполнения кода:
"abcde"
Смотрите также
-
класс
MessageBus,
который отправляет сообщения в шину -
метод
dispatch,
который выполняет отправку сообщения -
стамп
TransportNamesStamp,
который задаёт имена транспортов для сообщения -
атрибут
AsMessageHandler,
который помечает класс как обработчик сообщений