diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml index 1671810d39..14ffd4d382 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.xml @@ -73,6 +73,7 @@ + diff --git a/src/Symfony/Component/Messenger/CHANGELOG.md b/src/Symfony/Component/Messenger/CHANGELOG.md index 5bbe46a84e..e6aad77bf1 100644 --- a/src/Symfony/Component/Messenger/CHANGELOG.md +++ b/src/Symfony/Component/Messenger/CHANGELOG.md @@ -24,8 +24,7 @@ CHANGELOG to stop all `messenger:consume` workers. * [BC BREAK] The `TransportFactoryInterface::createTransport()` signature changed: a required 3rd `SerializerInterface` argument was added. - * Added a new `SyncTransport` along with `ForceCallHandlersStamp` to - explicitly handle messages synchronously. + * Added a new `SyncTransport` to explicitly handle messages synchronously. * Added `AmqpStamp` allowing to provide a routing key, flags and attributes on message publishing. * [BC BREAK] Removed publishing with a `routing_key` option from queue configuration, for AMQP. Use exchange `default_publish_routing_key` or `AmqpStamp` instead. diff --git a/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php b/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php index bc22da6b47..3e87a16067 100644 --- a/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php @@ -15,7 +15,6 @@ use Psr\Log\LoggerAwareTrait; use Psr\Log\NullLogger; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Event\SendMessageToTransportsEvent; -use Symfony\Component\Messenger\Stamp\ForceCallHandlersStamp; use Symfony\Component\Messenger\Stamp\ReceivedStamp; use Symfony\Component\Messenger\Stamp\RedeliveryStamp; use Symfony\Component\Messenger\Stamp\SentStamp; @@ -78,12 +77,6 @@ class SendMessageMiddleware implements MiddlewareInterface $envelope = $sender->send($envelope->with(new SentStamp(\get_class($sender), \is_string($alias) ? $alias : null))); } - // if the message was marked (usually by SyncTransport) that it handlers - // MUST be called, mark them to be handled. - if (null !== $envelope->last(ForceCallHandlersStamp::class)) { - $handle = true; - } - // on a redelivery, only send back to queue: never call local handlers if (null !== $redeliveryStamp) { $handle = false; diff --git a/src/Symfony/Component/Messenger/Stamp/ForceCallHandlersStamp.php b/src/Symfony/Component/Messenger/Stamp/ForceCallHandlersStamp.php deleted file mode 100644 index 5c9eb3a6d9..0000000000 --- a/src/Symfony/Component/Messenger/Stamp/ForceCallHandlersStamp.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Messenger\Stamp; - -/** - * Stamp marks that the handlers *should* be called immediately. - * - * This is used by the SyncTransport to indicate to the - * SendMessageMiddleware that handlers *should* be called - * immediately, even though a transport was set. - * - * @experimental in 4.3 - * - * @author Ryan Weaver - */ -class ForceCallHandlersStamp implements StampInterface -{ -} diff --git a/src/Symfony/Component/Messenger/Tests/Middleware/SendMessageMiddlewareTest.php b/src/Symfony/Component/Messenger/Tests/Middleware/SendMessageMiddlewareTest.php index 2df828ddcc..66eb53ca71 100644 --- a/src/Symfony/Component/Messenger/Tests/Middleware/SendMessageMiddlewareTest.php +++ b/src/Symfony/Component/Messenger/Tests/Middleware/SendMessageMiddlewareTest.php @@ -15,7 +15,6 @@ use Psr\Container\ContainerInterface; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Event\SendMessageToTransportsEvent; use Symfony\Component\Messenger\Middleware\SendMessageMiddleware; -use Symfony\Component\Messenger\Stamp\ForceCallHandlersStamp; use Symfony\Component\Messenger\Stamp\ReceivedStamp; use Symfony\Component\Messenger\Stamp\RedeliveryStamp; use Symfony\Component\Messenger\Stamp\SentStamp; @@ -88,8 +87,6 @@ class SendMessageMiddlewareTest extends MiddlewareTestCase public function testItSendsToOnlyOneSenderOnRedelivery() { $envelope = new Envelope(new DummyMessage('Hey'), [new RedeliveryStamp(5, 'bar')]); - // even with a ForceCallHandlersStamp, the next middleware won't be called - $envelope = $envelope->with(new ForceCallHandlersStamp()); $sender = $this->getMockBuilder(SenderInterface::class)->getMock(); $sender2 = $this->getMockBuilder(SenderInterface::class)->getMock(); @@ -270,21 +267,6 @@ class SendMessageMiddlewareTest extends MiddlewareTestCase $middleware->handle($envelope, $this->getStackMock(false)); } - public function testItHandlesWithForceCallHandlersStamp() - { - $envelope = new Envelope(new DummyMessage('original envelope')); - $envelope = $envelope->with(new ForceCallHandlersStamp()); - - $sender = $this->getMockBuilder(SenderInterface::class)->getMock(); - $sender->expects($this->once())->method('send')->willReturn($envelope); - - $sendersLocator = $this->createSendersLocator([DummyMessage::class => ['foo']], ['foo' => $sender]); - $middleware = new SendMessageMiddleware($sendersLocator); - - // next handler *should* be called - $middleware->handle($envelope, $this->getStackMock(true)); - } - private function createSendersLocator(array $sendersMap, array $senders, array $sendAndHandle = []) { $container = $this->createMock(ContainerInterface::class); diff --git a/src/Symfony/Component/Messenger/Tests/Transport/Sync/SyncTransportFactoryTest.php b/src/Symfony/Component/Messenger/Tests/Transport/Sync/SyncTransportFactoryTest.php index 1bef09b2d1..021c7ae970 100644 --- a/src/Symfony/Component/Messenger/Tests/Transport/Sync/SyncTransportFactoryTest.php +++ b/src/Symfony/Component/Messenger/Tests/Transport/Sync/SyncTransportFactoryTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Messenger\Tests\Transport\AmqpExt; use PHPUnit\Framework\TestCase; +use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; use Symfony\Component\Messenger\Transport\Sync\SyncTransport; use Symfony\Component\Messenger\Transport\Sync\SyncTransportFactory; @@ -21,7 +22,8 @@ class SyncTransportFactoryTest extends TestCase public function testCreateTransport() { $serializer = $this->createMock(SerializerInterface::class); - $factory = new SyncTransportFactory(); + $bus = $this->createMock(MessageBusInterface::class); + $factory = new SyncTransportFactory($bus); $transport = $factory->createTransport('sync://', [], $serializer); $this->assertInstanceOf(SyncTransport::class, $transport); } diff --git a/src/Symfony/Component/Messenger/Tests/Transport/Sync/SyncTransportTest.php b/src/Symfony/Component/Messenger/Tests/Transport/Sync/SyncTransportTest.php index 25bc6290d6..13549e2758 100644 --- a/src/Symfony/Component/Messenger/Tests/Transport/Sync/SyncTransportTest.php +++ b/src/Symfony/Component/Messenger/Tests/Transport/Sync/SyncTransportTest.php @@ -13,18 +13,29 @@ namespace Symfony\Component\Messenger\Tests\Transport\AmqpExt; use PHPUnit\Framework\TestCase; use Symfony\Component\Messenger\Envelope; -use Symfony\Component\Messenger\Stamp\ForceCallHandlersStamp; +use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Messenger\Stamp\ReceivedStamp; use Symfony\Component\Messenger\Transport\Sync\SyncTransport; class SyncTransportTest extends TestCase { public function testSend() { + $bus = $this->createMock(MessageBusInterface::class); + $bus->expects($this->once()) + ->method('dispatch') + ->with($this->callback(function ($arg) { + $this->assertInstanceOf(Envelope::class, $arg); + + return true; + })) + ->willReturnArgument(0); $message = new \stdClass(); $envelope = new Envelope($message); - $transport = new SyncTransport(); + $transport = new SyncTransport($bus); $envelope = $transport->send($envelope); + $this->assertSame($message, $envelope->getMessage()); - $this->assertNotNull($envelope->last(ForceCallHandlersStamp::class)); + $this->assertNotNull($envelope->last(ReceivedStamp::class)); } } diff --git a/src/Symfony/Component/Messenger/Transport/Sync/SyncTransport.php b/src/Symfony/Component/Messenger/Transport/Sync/SyncTransport.php index 47efd0182c..0553f83939 100644 --- a/src/Symfony/Component/Messenger/Transport/Sync/SyncTransport.php +++ b/src/Symfony/Component/Messenger/Transport/Sync/SyncTransport.php @@ -13,11 +13,13 @@ namespace Symfony\Component\Messenger\Transport\Sync; use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Exception\InvalidArgumentException; -use Symfony\Component\Messenger\Stamp\ForceCallHandlersStamp; +use Symfony\Component\Messenger\MessageBusInterface; +use Symfony\Component\Messenger\Stamp\ReceivedStamp; +use Symfony\Component\Messenger\Stamp\SentStamp; use Symfony\Component\Messenger\Transport\TransportInterface; /** - * A "fake" transport that marks messages to be handled immediately. + * Transport that immediately marks messages as received and dispatches for handling. * * @experimental in 4.3 * @@ -25,6 +27,13 @@ use Symfony\Component\Messenger\Transport\TransportInterface; */ class SyncTransport implements TransportInterface { + private $messageBus; + + public function __construct(MessageBusInterface $messageBus) + { + $this->messageBus = $messageBus; + } + public function get(): iterable { throw new InvalidArgumentException('You cannot receive messages from the Messenger SyncTransport.'); @@ -47,6 +56,12 @@ class SyncTransport implements TransportInterface public function send(Envelope $envelope): Envelope { - return $envelope->with(new ForceCallHandlersStamp()); + /** @var SentStamp|null $sentStamp */ + $sentStamp = $envelope->last(SentStamp::class); + $alias = null === $sentStamp ? 'sync' : $sentStamp->getSenderAlias() ?: $sentStamp->getSenderClass(); + + $envelope = $envelope->with(new ReceivedStamp($alias)); + + return $this->messageBus->dispatch($envelope); } } diff --git a/src/Symfony/Component/Messenger/Transport/Sync/SyncTransportFactory.php b/src/Symfony/Component/Messenger/Transport/Sync/SyncTransportFactory.php index d3a3459e9e..3c66512f48 100644 --- a/src/Symfony/Component/Messenger/Transport/Sync/SyncTransportFactory.php +++ b/src/Symfony/Component/Messenger/Transport/Sync/SyncTransportFactory.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Messenger\Transport\Sync; +use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface; use Symfony\Component\Messenger\Transport\TransportFactoryInterface; use Symfony\Component\Messenger\Transport\TransportInterface; @@ -22,9 +23,16 @@ use Symfony\Component\Messenger\Transport\TransportInterface; */ class SyncTransportFactory implements TransportFactoryInterface { + private $messageBus; + + public function __construct(MessageBusInterface $messageBus) + { + $this->messageBus = $messageBus; + } + public function createTransport(string $dsn, array $options, SerializerInterface $serializer): TransportInterface { - return new SyncTransport(); + return new SyncTransport($this->messageBus); } public function supports(string $dsn, array $options): bool