diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/CHANGELOG.md b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/CHANGELOG.md index b18222013f6c1..4ab15d4a14106 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/CHANGELOG.md +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +7.3 +--- + + * Add `BeanstalkdPriorityStamp` option to allow setting the message priority + 7.2 --- diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdSenderTest.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdSenderTest.php index 89ac3449f3a4b..94773538153a9 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdSenderTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/BeanstalkdSenderTest.php @@ -13,6 +13,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Component\Messenger\Bridge\Beanstalkd\Tests\Fixtures\DummyMessage; +use Symfony\Component\Messenger\Bridge\Beanstalkd\Transport\BeanstalkdPriorityStamp; use Symfony\Component\Messenger\Bridge\Beanstalkd\Transport\BeanstalkdSender; use Symfony\Component\Messenger\Bridge\Beanstalkd\Transport\Connection; use Symfony\Component\Messenger\Envelope; @@ -27,7 +28,7 @@ public function testSend() $encoded = ['body' => '...', 'headers' => ['type' => DummyMessage::class]]; $connection = $this->createMock(Connection::class); - $connection->expects($this->once())->method('send')->with($encoded['body'], $encoded['headers'], 0); + $connection->expects($this->once())->method('send')->with($encoded['body'], $encoded['headers'], 0, null); $serializer = $this->createMock(SerializerInterface::class); $serializer->method('encode')->with($envelope)->willReturn($encoded); @@ -42,7 +43,22 @@ public function testSendWithDelay() $encoded = ['body' => '...', 'headers' => ['type' => DummyMessage::class]]; $connection = $this->createMock(Connection::class); - $connection->expects($this->once())->method('send')->with($encoded['body'], $encoded['headers'], 500); + $connection->expects($this->once())->method('send')->with($encoded['body'], $encoded['headers'], 500, null); + + $serializer = $this->createMock(SerializerInterface::class); + $serializer->method('encode')->with($envelope)->willReturn($encoded); + + $sender = new BeanstalkdSender($connection, $serializer); + $sender->send($envelope); + } + + public function testSendWithPriority() + { + $envelope = (new Envelope(new DummyMessage('Oy')))->with(new BeanstalkdPriorityStamp(2)); + $encoded = ['body' => '...', 'headers' => ['type' => DummyMessage::class]]; + + $connection = $this->createMock(Connection::class); + $connection->expects($this->once())->method('send')->with($encoded['body'], $encoded['headers'], 0, 2); $serializer = $this->createMock(SerializerInterface::class); $serializer->method('encode')->with($envelope)->willReturn($encoded); diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/ConnectionTest.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/ConnectionTest.php index c4b7e904a544e..5673361f785f5 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/ConnectionTest.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Tests/Transport/ConnectionTest.php @@ -297,6 +297,41 @@ public function testSend() $this->assertSame($id, (int) $returnedId); } + public function testSendWithPriority() + { + $tube = 'xyz'; + + $body = 'foo'; + $headers = ['test' => 'bar']; + $delay = 1000; + $priority = 2; + $expectedDelay = $delay / 1000; + + $id = 110; + + $client = $this->createMock(PheanstalkInterface::class); + $client->expects($this->once())->method('useTube')->with($tube)->willReturn($client); + $client->expects($this->once())->method('put')->with( + $this->callback(function (string $data) use ($body, $headers): bool { + $expectedMessage = json_encode([ + 'body' => $body, + 'headers' => $headers, + ]); + + return $expectedMessage === $data; + }), + $priority, + $expectedDelay, + 90 + )->willReturn(new Job($id, 'foobar')); + + $connection = new Connection(['tube_name' => $tube], $client); + + $returnedId = $connection->send($body, $headers, $delay, $priority); + + $this->assertSame($id, (int) $returnedId); + } + public function testSendWhenABeanstalkdExceptionOccurs() { $tube = 'xyz'; diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdPriorityStamp.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdPriorityStamp.php new file mode 100644 index 0000000000000..5e55fb86d6af7 --- /dev/null +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdPriorityStamp.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Messenger\Bridge\Beanstalkd\Transport; + +use Symfony\Component\Messenger\Stamp\StampInterface; + +final readonly class BeanstalkdPriorityStamp implements StampInterface +{ + public function __construct( + public int $priority, + ) { + } +} diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdSender.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdSender.php index 8e7607f54267e..d43b56e103b57 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdSender.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/BeanstalkdSender.php @@ -35,11 +35,12 @@ public function send(Envelope $envelope): Envelope { $encodedMessage = $this->serializer->encode($envelope); - /** @var DelayStamp|null $delayStamp */ - $delayStamp = $envelope->last(DelayStamp::class); - $delayInMs = null !== $delayStamp ? $delayStamp->getDelay() : 0; - - $this->connection->send($encodedMessage['body'], $encodedMessage['headers'] ?? [], $delayInMs); + $this->connection->send( + $encodedMessage['body'], + $encodedMessage['headers'] ?? [], + $envelope->last(DelayStamp::class)?->getDelay() ?? 0, + $envelope->last(BeanstalkdPriorityStamp::class)?->priority, + ); return $envelope; } diff --git a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/Connection.php b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/Connection.php index 0f2c2c555a4fb..528bdc9618412 100644 --- a/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/Connection.php +++ b/src/Symfony/Component/Messenger/Bridge/Beanstalkd/Transport/Connection.php @@ -105,11 +105,12 @@ public function getTube(): string } /** - * @param int $delay The delay in milliseconds + * @param int $delay The delay in milliseconds + * @param ?int $priority The priority at which the message will be reserved * * @return string The inserted id */ - public function send(string $body, array $headers, int $delay = 0): string + public function send(string $body, array $headers, int $delay = 0, ?int $priority = null): string { $message = json_encode([ 'body' => $body, @@ -123,7 +124,7 @@ public function send(string $body, array $headers, int $delay = 0): string try { $job = $this->client->useTube($this->tube)->put( $message, - PheanstalkInterface::DEFAULT_PRIORITY, + $priority ?? PheanstalkInterface::DEFAULT_PRIORITY, (int) ($delay / 1000), $this->ttr ); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy