/
githubmirror
/
symfony
Обзор
Документация
Войти
/
githubmirror
/
symfony
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
8.2
src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php
84 строки
3 KB
HypeMC
[Messenger] Add idle timeout option to `BatchHandlerTrait`
06 фев 2026, 19:25
06 фев 2026, 19:25
93ae755
Код
Авторство
О чём код?
<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Messenger\Middleware; use Psr\EventDispatcher\EventDispatcherInterface; use Psr\Log\LoggerAwareTrait; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Event\MessageSentToTransportsEvent; use Symfony\Component\Messenger\Event\SendMessageToTransportsEvent; use Symfony\Component\Messenger\Exception\NoSenderForMessageException; use Symfony\Component\Messenger\Stamp\FlushBatchHandlersStamp; use Symfony\Component\Messenger\Stamp\ReceivedStamp; use Symfony\Component\Messenger\Stamp\SentStamp; use Symfony\Component\Messenger\Transport\Sender\SendersLocatorInterface; /** * @author Samuel Roze <samuel.roze@gmail.com> * @author Tobias Schultze <http://tobion.de> */ class SendMessageMiddleware implements MiddlewareInterface { use LoggerAwareTrait; public function __construct( private SendersLocatorInterface $sendersLocator, private ?EventDispatcherInterface $eventDispatcher = null, private bool $allowNoSenders = true, ) { } public function handle(Envelope $envelope, StackInterface $stack): Envelope { $context = [ 'class' => $envelope->getMessage()::class, ]; $sender = null; if ($envelope->all(ReceivedStamp::class)) { // it's a received message, do not send it back if (!$envelope->all(FlushBatchHandlersStamp::class)) { $this->logger?->info('Received message {class}', $context); } } else { $senders = $this->sendersLocator->getSenders($envelope); $senders = \is_array($senders) ? $senders : iterator_to_array($senders); if (null !== $this->eventDispatcher && $senders) { $event = new SendMessageToTransportsEvent($envelope, $senders); $this->eventDispatcher->dispatch($event); $envelope = $event->getEnvelope(); } foreach ($senders as $alias => $sender) { $this->logger?->info('Sending message {class} with {alias} sender using {sender}', $context + ['alias' => $alias, 'sender' => $sender::class]); $envelope = $sender->send($envelope->with(new SentStamp($sender::class, \is_string($alias) ? $alias : null))); } if (null !== $this->eventDispatcher && $senders) { $this->eventDispatcher->dispatch(new MessageSentToTransportsEvent($envelope, $senders)); } if (!$this->allowNoSenders && !$sender) { throw new NoSenderForMessageException(\sprintf('No sender for message "%s".', $context['class'])); } } if (null === $sender) { return $stack->next()->handle($envelope, $stack); } // message should only be sent and not be handled by the next middleware return $envelope; } }