Метод with класса Envelope
Метод with класса Envelope
создаёт новый конверт сообщения, добавляя к нему
переданные штампы. Первым параметром передаётся
штамп, который нужно добавить. Метод не изменяет
исходный конверт, а возвращает его копию с новым
набором штампов.
Штампы несут служебную информацию о сообщении:
задержку доставки, имя транспорта, имя шины,
сериализатор и так далее. Добавляя штамп через
метод with, вы управляете тем, как сообщение
будет обработано при отправке в очередь.
Синтаксис
public function with(StampInterface ...$stamps): Envelope
Пример
Давайте создадим конверт с сообщением и добавим к нему
штамп задержки DelayStamp,
чтобы сообщение попало в очередь не сразу, а через 10 секунд:
<?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\Envelope;
use Symfony\Component\Messenger\Stamp\DelayStamp;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_send')]
public function send(): Response
{
$envelope = new Envelope(new ArticleMessage('hello'));
$envelope = $envelope->with(new DelayStamp(10000));
$stamps = $envelope->all(DelayStamp::class);
return new Response((string) $stamps[0]->getDelay());
}
}
?>
Результат выполнения кода:
"10000"
Пример
Метод with принимает несколько штампов сразу.
Давайте добавим к конверту штамп задержки и штамп
имени шины BusNameStamp:
<?php
namespace App\Controller;
use App\Message\ArticleMessage;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Stamp\BusNameStamp;
use Symfony\Component\Messenger\Stamp\DelayStamp;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/multi', name: 'article_multi')]
public function multi(): Response
{
$envelope = new Envelope(new ArticleMessage('abcde'));
$envelope = $envelope->with(
new DelayStamp(5000),
new BusNameStamp('article.bus')
);
$bus = $envelope->last(BusNameStamp::class);
return new Response($bus->getBusName());
}
}
?>
Результат выполнения кода:
"article.bus"
Пример
Метод with не изменяет исходный конверт,
а возвращает новый. Давайте убедимся в этом,
сравнив количество штампов до и после вызова:
<?php
namespace App\Controller;
use App\Message\ArticleMessage;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\Envelope;
use Symfony\Component\Messenger\Stamp\DelayStamp;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/immutable', name: 'article_immutable')]
public function immutable(): Response
{
$envelope = new Envelope(new ArticleMessage('user'));
$before = count($envelope->all());
$newEnvelope = $envelope->with(new DelayStamp(1000));
$after = count($envelope->all());
$newAfter = count($newEnvelope->all());
return new Response($before . ' ' . $after . ' ' . $newAfter);
}
}
?>
Результат выполнения кода:
"0 0 1"
Смотрите также
-
класс
Envelope,
который оборачивает сообщение и его штампы -
метод
wrap,
который создаёт конверт из сообщения -
метод
all,
который возвращает все штампы конверта -
класс
DelayStamp,
который задаёт задержку доставки сообщения