Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

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

Sign up
Appearance settings

Commitb48b5bb

Browse files
Another implementation
1 parent3a78fe0 commitb48b5bb

File tree

3 files changed

+102
-20
lines changed

3 files changed

+102
-20
lines changed

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,15 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
2929
}
3030

3131
if (!$envelope->last(ReceivedStamp::class)) {
32-
$lock =$this->lockFactory->createLockFromKey($stamp->getKey(),$stamp->getTtl(), autoRelease:false);
33-
34-
$blocking =$stamp->getMode() === LockStamp::MODE_BLOCK;
35-
if (!$lock->acquire($blocking)) {
36-
return$envelope;
32+
if($stamp->shouldDiscardDuplicate()) {
33+
$lock =$this->lockFactory->createLockFromKey($stamp->getKey(),$stamp->getTtl(), autoRelease:false);
34+
if (!$lock->acquire()) {
35+
return$envelope;
36+
}
3737
}
38+
}elseif ($stamp->shouldBlockDuplicateInProcess()) {
39+
$lock =$this->lockFactory->createLockFromKey($stamp->getKey(),$stamp->getTtl(), autoRelease:false);
40+
$lock->acquire(true);
3841
}elseif ($stamp->shouldBeReleasedBeforeHandlerCall()) {
3942
$this->lockFactory->createLockFromKey($stamp->getKey())->release();
4043
}

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

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,18 @@
1212
namespaceSymfony\Component\Messenger\Stamp;
1313

1414
useSymfony\Component\Lock\Key;
15-
useSymfony\Component\Messenger\Exception\InvalidArgumentException;
1615

1716
finalclass LockStampimplements StampInterface
1817
{
19-
publicconstMODE_DISCARD =0;
20-
publicconstMODE_BLOCK =1;
18+
publicconstMODE_DISCARD_DUPLICATE_IN_QUEUE =0;
19+
publicconstMODE_DISCARD_DUPLICATE_IN_QUEUE_OR_PROCESS =1;
20+
publicconstMODE_BLOCK_DUPLICATE_IN_PROCESS =2;
21+
22+
privateconstMODES = [
23+
self::MODE_DISCARD_DUPLICATE_IN_QUEUE,
24+
self::MODE_DISCARD_DUPLICATE_IN_QUEUE_OR_PROCESS,
25+
self::MODE_BLOCK_DUPLICATE_IN_PROCESS,
26+
];
2127

2228
privateKey$key;
2329

@@ -28,10 +34,9 @@ public function __construct(
2834
privateint$mode,
2935
string$key,
3036
private ?float$ttl =300.0,
31-
privatebool$shouldBeReleasedBeforeHandlerCall =false,
3237
) {
33-
if (!\in_array($this->mode,[self::MODE_DISCARD,self::MODE_BLOCK])) {
34-
thrownewInvalidArgumentException(\sprintf('Supported modes are "%s".',implode('", "',[self::MODE_DISCARD,self::MODE_BLOCK])));
38+
if (!\in_array($this->mode,self::MODES)) {
39+
thrownewInvalidArgumentException(\sprintf('Supported modes are "%s".',implode('", "',self::MODES)));
3540
}
3641

3742
$this->key =newKey($key);
@@ -45,18 +50,31 @@ public function getMode(): int
4550
return$this->mode;
4651
}
4752

48-
publicfunctiongetKey():Key
53+
publicfunctionshouldDiscardDuplicate():bool
4954
{
50-
return$this->key;
55+
return\in_array($this->mode, [
56+
self::MODE_DISCARD_DUPLICATE_IN_QUEUE,
57+
self::MODE_DISCARD_DUPLICATE_IN_QUEUE_OR_PROCESS,
58+
]);
5159
}
5260

53-
publicfunctiongetTtl():?float
61+
publicfunctionshouldBlockDuplicateInProcess():bool
5462
{
55-
return$this->ttl;
63+
returnself::MODE_BLOCK_DUPLICATE_IN_PROCESS ===$this->mode;
5664
}
5765

5866
publicfunctionshouldBeReleasedBeforeHandlerCall():bool
5967
{
60-
return$this->shouldBeReleasedBeforeHandlerCall;
68+
returnself::MODE_DISCARD_DUPLICATE_IN_QUEUE ===$this->mode;
69+
}
70+
71+
publicfunctiongetKey():Key
72+
{
73+
return$this->key;
74+
}
75+
76+
publicfunctiongetTtl(): ?float
77+
{
78+
return$this->ttl;
6179
}
6280
}

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

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ public function testLockMiddlewareIgnoreIfMessageIsNotLockable()
3636
$decorator->handle($envelope,$this->getStackMock(true));
3737
}
3838

39-
publicfunctiontestLockMiddlewareIfMessageHasKey()
39+
publicfunctiontestLockMiddlewareIfMessageHasKeyWithFirstMode()
4040
{
4141
$message =newDummyMessage('Hello');
42-
$envelope =newEnvelope($message, [newLockStamp(LockStamp::MODE_DISCARD,'id')]);
42+
$envelope =newEnvelope($message, [newLockStamp(LockStamp::MODE_DISCARD_DUPLICATE_IN_QUEUE,'id')]);
4343

4444
if (SemaphoreStore::isSupported()) {
4545
$store =newSemaphoreStore();
@@ -53,7 +53,7 @@ public function testLockMiddlewareIfMessageHasKey()
5353
$this->assertNotNull($envelope->last(LockStamp::class));
5454

5555
$message2 =newDummyMessage('Hello');
56-
$envelope2 =newEnvelope($message2, [newLockStamp(LockStamp::MODE_DISCARD,'id')]);
56+
$envelope2 =newEnvelope($message2, [newLockStamp(LockStamp::MODE_DISCARD_DUPLICATE_IN_QUEUE,'id')]);
5757

5858
$decorator->handle($envelope2,$this->getStackMock(false));
5959

@@ -62,7 +62,68 @@ public function testLockMiddlewareIfMessageHasKey()
6262
$decorator->handle($envelope,$this->getStackMock(true));
6363

6464
$message3 =newDummyMessage('Hello');
65-
$envelope3 =newEnvelope($message3, [newLockStamp(LockStamp::MODE_DISCARD,'id')]);
65+
$envelope3 =newEnvelope($message3, [newLockStamp(LockStamp::MODE_DISCARD_DUPLICATE_IN_QUEUE,'id')]);
66+
$decorator->handle($envelope3,$this->getStackMock(true));
67+
}
68+
69+
publicfunctiontestLockMiddlewareIfMessageHasKeyWithSecondMode()
70+
{
71+
$message =newDummyMessage('Hello');
72+
$envelope =newEnvelope($message, [newLockStamp(LockStamp::MODE_DISCARD_DUPLICATE_IN_QUEUE_OR_PROCESS,'id')]);
73+
74+
if (SemaphoreStore::isSupported()) {
75+
$store =newSemaphoreStore();
76+
}else {
77+
$store =newFlockStore();
78+
}
79+
80+
$decorator =newLockMiddleware(newLockFactory($store));
81+
82+
$envelope =$decorator->handle($envelope,$this->getStackMock(true));
83+
$this->assertNotNull($envelope->last(LockStamp::class));
84+
85+
$message2 =newDummyMessage('Hello');
86+
$envelope2 =newEnvelope($message2, [newLockStamp(LockStamp::MODE_DISCARD_DUPLICATE_IN_QUEUE_OR_PROCESS,'id')]);
87+
88+
$decorator->handle($envelope2,$this->getStackMock(false));
89+
90+
// Simulate receiving the first message
91+
$envelope =$envelope->with(newReceivedStamp('transport'));
92+
$decorator->handle($envelope,$this->getStackMock(true));
93+
94+
$message3 =newDummyMessage('Hello');
95+
$envelope3 =newEnvelope($message3, [newLockStamp(LockStamp::MODE_DISCARD_DUPLICATE_IN_QUEUE_OR_PROCESS,'id')]);
96+
$decorator->handle($envelope3,$this->getStackMock(true));
97+
}
98+
99+
publicfunctiontestLockMiddlewareIfMessageHasKeyWithThirdMode()
100+
{
101+
$message =newDummyMessage('Hello');
102+
$envelope =newEnvelope($message, [newLockStamp(LockStamp::MODE_BLOCK_DUPLICATE_IN_PROCESS,'id')]);
103+
104+
if (SemaphoreStore::isSupported()) {
105+
$store =newSemaphoreStore();
106+
}else {
107+
$store =newFlockStore();
108+
}
109+
110+
$decorator =newLockMiddleware(newLockFactory($store));
111+
112+
$envelope =$decorator->handle($envelope,$this->getStackMock(true));
113+
$this->assertNotNull($envelope->last(LockStamp::class));
114+
115+
$message2 =newDummyMessage('Hello');
116+
$envelope2 =newEnvelope($message2, [newLockStamp(LockStamp::MODE_BLOCK_DUPLICATE_IN_PROCESS,'id')]);
117+
118+
// Not blocking when adding the message in the queue.
119+
$decorator->handle($envelope2,$this->getStackMock(true));
120+
121+
// Simulate receiving the first message
122+
$envelope =$envelope->with(newReceivedStamp('transport'));
123+
$decorator->handle($envelope,$this->getStackMock(true));
124+
125+
$message3 =newDummyMessage('Hello');
126+
$envelope3 =newEnvelope($message3, [newLockStamp(LockStamp::MODE_BLOCK_DUPLICATE_IN_PROCESS,'id')]);
66127
$decorator->handle($envelope3,$this->getStackMock(true));
67128
}
68129
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp