Skip to content

Commit d231e82

Browse files
committed
Move fromMessage() method out of EnvelopeTrait and create its own key for the FailureEnvelope.
1 parent 22a0456 commit d231e82

File tree

7 files changed

+45
-28
lines changed

7 files changed

+45
-28
lines changed

src/Message/EnvelopeTrait.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,6 @@ public function getData(): mixed
3131
return $this->message->getData();
3232
}
3333

34-
public static function fromMessage(MessageInterface $message): self
35-
{
36-
return new static($message);
37-
}
38-
3934
public function getMetadata(): array
4035
{
4136
return array_merge(

src/Message/IdEnvelope.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ public function __construct(
1919
) {
2020
}
2121

22+
public static function fromMessage(MessageInterface $message): self
23+
{
24+
return new self($message, $message->getMetadata()[self::MESSAGE_ID_KEY] ?? null);
25+
}
26+
2227
public function setId(string|int|null $id): void
2328
{
2429
$this->id = $id;

src/Middleware/FailureHandling/FailureEnvelope.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,24 @@ final class FailureEnvelope implements EnvelopeInterface
1212
{
1313
use EnvelopeTrait;
1414

15+
public const FAILURE_META_KEY = 'failure-meta';
16+
1517
public function __construct(
1618
private MessageInterface $message,
1719
private array $meta = [],
1820
) {
1921
}
2022

23+
public static function fromMessage(MessageInterface $message): self
24+
{
25+
return new self($message, $message->getMetadata()[self::FAILURE_META_KEY] ?? []);
26+
}
27+
2128
public function getMetadata(): array
2229
{
23-
return array_merge($this->message->getMetadata(), $this->meta);
30+
$meta = $this->message->getMetadata();
31+
$meta[self::FAILURE_META_KEY] = array_merge($meta[self::FAILURE_META_KEY] ?? [], $this->meta);
32+
33+
return $meta;
2434
}
2535
}

src/Middleware/FailureHandling/Implementation/ExponentialDelayMiddleware.php

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace Yiisoft\Queue\Middleware\FailureHandling\Implementation;
66

77
use InvalidArgumentException;
8-
use Yiisoft\Queue\Message\Message;
98
use Yiisoft\Queue\Message\MessageInterface;
109
use Yiisoft\Queue\Middleware\FailureHandling\FailureHandlingRequest;
1110
use Yiisoft\Queue\Middleware\FailureHandling\MessageFailureHandlerInterface;
@@ -24,7 +23,7 @@ final class ExponentialDelayMiddleware implements MiddlewareFailureInterface
2423
public const META_KEY_DELAY = 'failure-strategy-exponential-delay-delay';
2524

2625
/**
27-
* @param string $id A unique id to differentiate two and more objects of this class
26+
* @param string $id A unique id to differentiate two and more instances of this class
2827
* @param int $maxAttempts Maximum attempts count for this strategy with the given $id before it will give up
2928
* @param float $delayInitial The first delay period
3029
* @param float $delayMaximum The maximum delay period
@@ -84,21 +83,20 @@ private function suites(MessageInterface $message): bool
8483

8584
private function createNewMeta(MessageInterface $message): array
8685
{
87-
$meta = $message->getMetadata();
88-
$meta[self::META_KEY_DELAY . "-$this->id"] = $this->getDelay($message);
89-
$meta[self::META_KEY_ATTEMPTS . "-$this->id"] = $this->getAttempts($message) + 1;
90-
91-
return $meta;
86+
return [
87+
self::META_KEY_DELAY . "-$this->id" => $this->getDelay($message),
88+
self::META_KEY_ATTEMPTS . "-$this->id" => $this->getAttempts($message) + 1,
89+
];
9290
}
9391

9492
private function getAttempts(MessageInterface $message): int
9593
{
96-
return $message->getMetadata()[self::META_KEY_ATTEMPTS . "-$this->id"] ?? 0;
94+
return $message->getMetadata()[FailureEnvelope::FAILURE_META_KEY][self::META_KEY_ATTEMPTS . "-$this->id"] ?? 0;
9795
}
9896

9997
private function getDelay(MessageInterface $message): float
10098
{
101-
$meta = $message->getMetadata();
99+
$meta = $message->getMetadata()[FailureEnvelope::FAILURE_META_KEY] ?? [];
102100
$key = self::META_KEY_DELAY . "-$this->id";
103101

104102
$delayOriginal = (float) ($meta[$key] ?? 0);

src/Middleware/FailureHandling/Implementation/SendAgainMiddleware.php

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@ final class SendAgainMiddleware implements MiddlewareFailureInterface
2020
public const META_KEY_RESEND = 'failure-strategy-resend-attempts';
2121

2222
/**
23-
* @param string $id A unique id to differentiate two and more objects of this class
23+
* @param string $id A unique id to differentiate two and more instances of this class
2424
* @param int $maxAttempts Maximum attempts count for this strategy with the given $id before it will give up
25-
* @param QueueInterface|null $queue
25+
* @param QueueInterface|null $targetQueue Messages will be sent to this queue if set.
26+
* They will be resent to an original queue otherwise.
2627
*/
2728
public function __construct(
2829
private string $id,
2930
private int $maxAttempts,
30-
private ?QueueInterface $queue = null,
31+
private ?QueueInterface $targetQueue = null,
3132
) {
3233
if ($maxAttempts < 1) {
3334
throw new InvalidArgumentException("maxAttempts parameter must be a positive integer, $this->maxAttempts given.");
@@ -41,10 +42,10 @@ public function processFailure(
4142
$message = $request->getMessage();
4243
if ($this->suites($message)) {
4344
$envelope = new FailureEnvelope($message, $this->createMeta($message));
44-
$envelope = ($this->queue ?? $request->getQueue())->push($envelope);
45+
$envelope = ($this->targetQueue ?? $request->getQueue())->push($envelope);
4546

4647
return $request->withMessage($envelope)
47-
->withQueue($this->queue ?? $request->getQueue());
48+
->withQueue($this->targetQueue ?? $request->getQueue());
4849
}
4950

5051
return $handler->handleFailure($request);
@@ -57,15 +58,12 @@ private function suites(MessageInterface $message): bool
5758

5859
private function createMeta(MessageInterface $message): array
5960
{
60-
$metadata = $message->getMetadata();
61-
$metadata[$this->getMetaKey()] = $this->getAttempts($message) + 1;
62-
63-
return $metadata;
61+
return [$this->getMetaKey() => $this->getAttempts($message) + 1];
6462
}
6563

6664
private function getAttempts(MessageInterface $message): int
6765
{
68-
$result = $message->getMetadata()[$this->getMetaKey()] ?? 0;
66+
$result = $message->getMetadata()[FailureEnvelope::FAILURE_META_KEY][$this->getMetaKey()] ?? 0;
6967
if ($result < 0) {
7068
$result = 0;
7169
}

tests/Unit/Middleware/FailureHandling/Implementation/ExponentialDelayMiddlewareTest.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use InvalidArgumentException;
99
use PHPUnit\Framework\Attributes\DataProvider;
1010
use Yiisoft\Queue\Message\Message;
11+
use Yiisoft\Queue\Middleware\FailureHandling\FailureEnvelope;
1112
use Yiisoft\Queue\Middleware\FailureHandling\FailureHandlingRequest;
1213
use Yiisoft\Queue\Middleware\FailureHandling\Implementation\ExponentialDelayMiddleware;
1314
use Yiisoft\Queue\Middleware\FailureHandling\MessageFailureHandlerInterface;
@@ -148,16 +149,22 @@ public function testPipelineSuccess(): void
148149

149150
self::assertNotEquals($request, $result);
150151
$message = $result->getMessage();
151-
self::assertArrayHasKey(ExponentialDelayMiddleware::META_KEY_ATTEMPTS . '-test', $message->getMetadata());
152-
self::assertArrayHasKey(ExponentialDelayMiddleware::META_KEY_DELAY . '-test', $message->getMetadata());
152+
self::assertArrayHasKey(FailureEnvelope::FAILURE_META_KEY, $message->getMetadata());
153+
154+
$meta = $message->getMetadata()[FailureEnvelope::FAILURE_META_KEY];
155+
self::assertArrayHasKey(ExponentialDelayMiddleware::META_KEY_ATTEMPTS . '-test', $meta);
156+
self::assertArrayHasKey(ExponentialDelayMiddleware::META_KEY_DELAY . '-test', $meta);
153157
}
154158

155159
public function testPipelineFailure(): void
156160
{
157161
$this->expectException(Exception::class);
158162
$this->expectExceptionMessage('test');
159163

160-
$message = new Message('test', null, [ExponentialDelayMiddleware::META_KEY_ATTEMPTS . '-test' => 2]);
164+
$message = new Message(
165+
'test',
166+
null,
167+
[FailureEnvelope::FAILURE_META_KEY => [ExponentialDelayMiddleware::META_KEY_ATTEMPTS . '-test' => 2]]);
161168
$queue = $this->createMock(QueueInterface::class);
162169
$middleware = new ExponentialDelayMiddleware(
163170
'test',

tests/Unit/Middleware/FailureHandling/Implementation/SendAgainMiddlewareTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use RuntimeException;
1111
use Yiisoft\Queue\Message\Message;
1212
use Yiisoft\Queue\Message\MessageInterface;
13+
use Yiisoft\Queue\Middleware\FailureHandling\FailureEnvelope;
1314
use Yiisoft\Queue\Middleware\FailureHandling\FailureHandlingRequest;
1415
use Yiisoft\Queue\Middleware\FailureHandling\Implementation\ExponentialDelayMiddleware;
1516
use Yiisoft\Queue\Middleware\FailureHandling\Implementation\SendAgainMiddleware;
@@ -150,6 +151,9 @@ public function testQueueSendingStrategies(
150151
$this->expectExceptionMessage('testException');
151152
}
152153

154+
$metaInitial = [FailureEnvelope::FAILURE_META_KEY => $metaInitial];
155+
$metaResult = [FailureEnvelope::FAILURE_META_KEY => $metaResult];
156+
153157
$handler = $this->getHandler($metaResult, $suites);
154158
$queue = $this->getPreparedQueue($metaResult, $suites);
155159

0 commit comments

Comments
 (0)