Класс RoutedMessage
Класс RoutedMessage представляет собой
обёртку над сообщением, которая позволяет
указать транспорты для маршрутизации. Он
используется внутри MessageBus, когда
необходимо отправить сообщение в конкретный
транспорт, минуя стандартную маршрутизацию.
Первым параметром принимается само сообщение,
вторым - массив имён транспортов.
Синтаксис
new RoutedMessage(object $message, array $transportNames)
Пример
Давайте создадим класс сообщения и обернём
его в RoutedMessage с указанием
транспорта 'async':
<?php
namespace App\Message;
class ArticleMessage
{
public function __construct(
private string $text,
) {
}
public function getText(): string
{
return $this->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\Messenger\RoutedMessage;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_send')]
public function send(MessageBusInterface $bus): Response
{
$message = new ArticleMessage('hello');
$routed = new RoutedMessage($message, ['async']);
$bus->dispatch($routed);
return new Response('sent');
}
}
?>
Результат выполнения кода:
"sent"
Пример
Давайте укажем несколько транспортов одновременно:
<?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\RoutedMessage;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/multi', name: 'article_multi')]
public function multi(MessageBusInterface $bus): Response
{
$message = new ArticleMessage('abcde');
$routed = new RoutedMessage(
$message,
['async', 'audit'],
);
$bus->dispatch($routed);
return new Response('routed');
}
}
?>
Результат выполнения кода:
"routed"
В этом случае сообщение будет отправлено
сразу в оба транспорта 'async'
и 'audit'.
Смотрите также
-
класс
MessageBus,
который диспатчит сообщения в шину -
класс
Envelope,
который оборачивает сообщение со штампами -
класс
TransportNamesStamp,
который задаёт имена транспортов -
метод
dispatch,
который отправляет сообщение в шину