Параметр priority атрибута AsMessageHandler
Атрибут AsMessageHandler вешается на класс-обработчик
сообщения. Параметр priority задаёт приоритет этого
обработчика. Когда на одно сообщение подписано несколько
обработчиков, шина сортирует их по убыванию приоритета:
сначала вызывается обработчик с наибольшим числом, затем
с меньшим. Если параметр не указан, приоритет считается
равным нулю.
Синтаксис
#[AsMessageHandler(priority: priority)]
Пример
Давайте создадим сообщение и два обработчика с разным приоритетом. Сообщение будет хранить строку:
<?php
namespace App\Message;
class ArticleMessage
{
public function __construct(
public string $text,
) {
}
}
?>
Теперь создадим первый обработчик с приоритетом 10:
<?php
namespace App\MessageHandler;
use App\Message\ArticleMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler(priority: 10)]
class FirstHandler
{
public function __invoke(ArticleMessage $message): void
{
echo 'first: ' . $message->text . PHP_EOL;
}
}
?>
И второй обработчик с приоритетом 5:
<?php
namespace App\MessageHandler;
use App\Message\ArticleMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler(priority: 5)]
class SecondHandler
{
public function __invoke(ArticleMessage $message): void
{
echo 'second: ' . $message->text . PHP_EOL;
}
}
?>
Давайте отправим сообщение через шину из контроллера:
<?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('/article', name: 'article_index')]
public function index(MessageBusInterface $bus): Response
{
$bus->dispatch(new ArticleMessage('abcde'));
return new Response('sent');
}
}
?>
Результат выполнения кода:
"first: abcde"
"second: abcde"
Как видно, обработчик с приоритетом 10 выполнился
раньше обработчика с приоритетом 5, несмотря на то,
что был объявлен позже.
Пример
Давайте посмотрим, что произойдёт, если поменять приоритеты
местами. Первому обработчику поставим 5:
<?php
namespace App\MessageHandler;
use App\Message\ArticleMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler(priority: 5)]
class FirstHandler
{
public function __invoke(ArticleMessage $message): void
{
echo 'first: ' . $message->text . PHP_EOL;
}
}
?>
А второму - 10:
<?php
namespace App\MessageHandler;
use App\Message\ArticleMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler(priority: 10)]
class SecondHandler
{
public function __invoke(ArticleMessage $message): void
{
echo 'second: ' . $message->text . PHP_EOL;
}
}
?>
Результат выполнения кода:
"second: abcde"
"first: abcde"
Теперь первым выполнился второй обработчик, так как его приоритет стал выше.
Пример
Давайте создадим обработчик без параметра priority
и обработчик с отрицательным приоритетом -10:
<?php
namespace App\MessageHandler;
use App\Message\ArticleMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler]
class FirstHandler
{
public function __invoke(ArticleMessage $message): void
{
echo 'first: ' . $message->text . PHP_EOL;
}
}
?>
Второй обработчик получит приоритет -10:
<?php
namespace App\MessageHandler;
use App\Message\ArticleMessage;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler(priority: -10)]
class SecondHandler
{
public function __invoke(ArticleMessage $message): void
{
echo 'second: ' . $message->text . PHP_EOL;
}
}
?>
Результат выполнения кода:
"first: abcde"
"second: abcde"
Обработчик без priority имеет приоритет 0,
поэтому он выполнился раньше обработчика с -10.
Смотрите также
-
атрибут
AsMessageHandler,
который помечает класс как обработчик сообщений -
параметр
handles,
который задаёт обрабатываемое сообщение -
параметр
bus,
который привязывает обработчик к конкретной шине -
класс
MessageBus,
который отправляет сообщения обработчикам