Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 5cf5b1d

Browse filesBrowse files
Rely on stamp rather than interface
1 parent 9a77765 commit 5cf5b1d
Copy full SHA for 5cf5b1d

File tree

6 files changed

+32
-135
lines changed
Filter options

6 files changed

+32
-135
lines changed

‎src/Symfony/Component/Messenger/Message/LockableMessageInterface.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Messenger/Message/LockableMessageInterface.php
-25
This file was deleted.

‎src/Symfony/Component/Messenger/Message/TTLAwareLockableMessageInterface.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Messenger/Message/TTLAwareLockableMessageInterface.php
-17
This file was deleted.

‎src/Symfony/Component/Messenger/Middleware/LockMiddleware.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Messenger/Middleware/LockMiddleware.php
+12-37
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,8 @@
1111

1212
namespace Symfony\Component\Messenger\Middleware;
1313

14-
use Symfony\Component\Lock\Key;
1514
use Symfony\Component\Lock\LockFactory;
1615
use Symfony\Component\Messenger\Envelope;
17-
use Symfony\Component\Messenger\Message\LockableMessageInterface;
18-
use Symfony\Component\Messenger\Message\TTLAwareLockableMessageInterface;
1916
use Symfony\Component\Messenger\Stamp\LockStamp;
2017
use Symfony\Component\Messenger\Stamp\ReceivedStamp;
2118

@@ -30,53 +27,31 @@ public function __construct(LockFactory $lockFactory)
3027

3128
public function handle(Envelope $envelope, StackInterface $stack): Envelope
3229
{
33-
$message = $envelope->getMessage();
34-
if (!$message instanceof LockableMessageInterface) {
30+
$stamp = $envelope->last(LockStamp::class);
31+
if (!$stamp instanceof LockStamp) {
3532
return $stack->next()->handle($envelope, $stack);
3633
}
3734

3835
if (null === $envelope->last(ReceivedStamp::class)) {
39-
// If we're trying to dispatch a lockable message.
40-
$keyResource = $message->getKey();
41-
42-
if (null !== $keyResource) {
43-
$key = new Key($keyResource);
44-
45-
// The acquire call must be done before stamping the message
46-
// in order to have the full state of the key in the stamp.
47-
$lock = $message instanceof TTLAwareLockableMessageInterface
48-
? $this->lockFactory->createLockFromKey($key, $message->getTTL(), autoRelease: false)
49-
: $this->lockFactory->createLockFromKey($key, autoRelease: false);
50-
51-
if (!$lock->acquire()) {
52-
return $envelope;
53-
}
54-
55-
// The acquire call must be done before stamping the message
56-
// in order to have the full state of the key in the stamp.
57-
$envelope = $envelope->with(new LockStamp($key, $message->shouldBeReleasedBeforeHandlerCall()));
36+
$lock = $this->lockFactory->createLockFromKey($stamp->getKey(), $stamp->getTtl(), autoRelease: false);
37+
if (!$lock->acquire()) {
38+
return $envelope;
5839
}
59-
} else {
60-
$this->releaseLock($envelope, true);
40+
} elseif ($stamp->shouldBeReleasedBeforeHandlerCall()) {
41+
$this->lockFactory->createLockFromKey($stamp->getKey())->release();
6142
}
6243

6344
try {
6445
$envelope = $stack->next()->handle($envelope, $stack);
6546
} finally {
66-
// If we've received a lockable message, we're releasing it.
67-
if (null !== $envelope->last(ReceivedStamp::class)) {
68-
$this->releaseLock($envelope, false);
47+
if (
48+
null !== $envelope->last(ReceivedStamp::class)
49+
&& !$stamp->shouldBeReleasedBeforeHandlerCall()
50+
) {
51+
$this->lockFactory->createLockFromKey($stamp->getKey())->release();
6952
}
7053
}
7154

7255
return $envelope;
7356
}
74-
75-
private function releaseLock(Envelope $envelope, bool $beforeHandlerCall): void
76-
{
77-
$stamp = $envelope->last(LockStamp::class);
78-
if ($stamp instanceof LockStamp && $stamp->shouldBeReleasedBeforHandlerCall() === $beforeHandlerCall) {
79-
$this->lockFactory->createLockFromKey($stamp->getKey())->release();
80-
}
81-
}
8257
}

‎src/Symfony/Component/Messenger/Stamp/LockStamp.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Messenger/Stamp/LockStamp.php
+14-3
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,17 @@
1616
final class LockStamp implements StampInterface
1717
{
1818
private Key $key;
19+
private ?float $ttl;
1920
private bool $shouldBeReleasedBeforeHandlerCall;
2021

21-
public function __construct(Key $key, bool $shouldBeReleasedBeforeHandlerCall)
22+
public function __construct(
23+
string $key,
24+
?float $ttl = 300.0,
25+
bool $shouldBeReleasedBeforeHandlerCall = false,
26+
)
2227
{
23-
$this->key = $key;
28+
$this->key = new Key($key);
29+
$this->ttl = $ttl;
2430
$this->shouldBeReleasedBeforeHandlerCall = $shouldBeReleasedBeforeHandlerCall;
2531
}
2632

@@ -29,7 +35,12 @@ public function getKey(): Key
2935
return $this->key;
3036
}
3137

32-
public function shouldBeReleasedBeforHandlerCall(): bool
38+
public function getTtl(): ?float
39+
{
40+
return $this->ttl;
41+
}
42+
43+
public function shouldBeReleasedBeforeHandlerCall(): bool
3344
{
3445
return $this->shouldBeReleasedBeforeHandlerCall;
3546
}

‎src/Symfony/Component/Messenger/Tests/Fixtures/DummyLockableMessage.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Messenger/Tests/Fixtures/DummyLockableMessage.php
-33
This file was deleted.

‎src/Symfony/Component/Messenger/Tests/Middleware/LockMiddlewareTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/Messenger/Tests/Middleware/LockMiddlewareTest.php
+6-20
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
use Symfony\Component\Messenger\Stamp\LockStamp;
2020
use Symfony\Component\Messenger\Stamp\ReceivedStamp;
2121
use Symfony\Component\Messenger\Test\Middleware\MiddlewareTestCase;
22-
use Symfony\Component\Messenger\Tests\Fixtures\DummyLockableMessage;
2322
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
2423

2524
final class LockMiddlewareTest extends MiddlewareTestCase
@@ -37,23 +36,10 @@ public function testLockMiddlewareIgnoreIfMessageIsNotLockable()
3736
$decorator->handle($envelope, $this->getStackMock(true));
3837
}
3938

40-
public function testLockMiddlewareIgnoreIfMessageHasNoKey()
41-
{
42-
$message = new DummyLockableMessage('Hello', null);
43-
$envelope = new Envelope($message);
44-
45-
$lockFactory = $this->createMock(LockFactory::class);
46-
$lockFactory->expects($this->never())->method('createLock');
47-
48-
$decorator = new LockMiddleware($lockFactory);
49-
50-
$decorator->handle($envelope, $this->getStackMock(true));
51-
}
52-
5339
public function testLockMiddlewareIfMessageHasKey()
5440
{
55-
$message = new DummyLockableMessage('Hello', 'id');
56-
$envelope = new Envelope($message);
41+
$message = new DummyMessage('Hello');
42+
$envelope = new Envelope($message, [new LockStamp('id')]);
5743

5844
if (SemaphoreStore::isSupported()) {
5945
$store = new SemaphoreStore();
@@ -66,17 +52,17 @@ public function testLockMiddlewareIfMessageHasKey()
6652
$envelope = $decorator->handle($envelope, $this->getStackMock(true));
6753
$this->assertNotNull($envelope->last(LockStamp::class));
6854

69-
$message2 = new DummyLockableMessage('Hello', 'id');
70-
$envelope2 = new Envelope($message2);
55+
$message2 = new DummyMessage('Hello');
56+
$envelope2 = new Envelope($message2, [new LockStamp('id')]);
7157

7258
$decorator->handle($envelope2, $this->getStackMock(false));
7359

7460
// Simulate receiving the first message
7561
$envelope = $envelope->with(new ReceivedStamp('transport'));
7662
$decorator->handle($envelope, $this->getStackMock(true));
7763

78-
$message3 = new DummyLockableMessage('Hello', 'id');
79-
$envelope3 = new Envelope($message3);
64+
$message3 = new DummyMessage('Hello');
65+
$envelope3 = new Envelope($message3, [new LockStamp('id')]);
8066
$decorator->handle($envelope3, $this->getStackMock(true));
8167
}
8268
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.