Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit bbe1bb7

Browse files
committed
bug #39598 [Messenger] Fix stopwach usage if it has been reset (lyrixx)
This PR was merged into the 4.4 branch. Discussion ---------- [Messenger] Fix stopwach usage if it has been reset | Q | A | ------------- | --- | Branch? | 4.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | | License | MIT | Doc PR | I'm slowly migrating an application to messenger (from swarrot) and I hit a strange bug. My message was well processeed **BUT** retry! It comes from two things * I manually reset the application (via the service resetter, to keep a low memory usage) * symfony/messenger try to collect some information, but since the stopwatch has been reset, an exception occurs and the message has been retried So this patch avoid throwing an exception when everything works well <details> <summary>the trace:</summary> ``` 18:45:41 INFO [messenger] Message AppBundle\Crawler\Messenger\Message\CrawlSitemapMessage handled by AppBundle\Crawler\Messenger\MessageHandler\CrawlSitemapMessageHa ndler::__invoke [ "message" => AppBundle\Crawler\Messenger\Message\CrawlSitemapMessage^ { -crawlId: "885d23a7-8ad5-4935-a2b3-1c114ac76ded" }, "class" => "AppBundle\Crawler\Messenger\Message\CrawlSitemapMessage", "handler" => "AppBundle\Crawler\Messenger\MessageHandler\CrawlSitemapMessageHandler::__invoke" ] 18:45:41 ERROR [messenger] Error thrown while handling message AppBundle\Crawler\Messenger\Message\CrawlSitemapMessage. Sending for retry #1 using 1000 ms delay. Erro r: "Event ""Symfony\Component\Messenger\Middleware\HandleMessageMiddleware" on "messenger.bus.default"" is not started." [ "message" => AppBundle\Crawler\Messenger\Message\CrawlSitemapMessage^ { -crawlId: "885d23a7-8ad5-4935-a2b3-1c114ac76ded" }, "class" => "AppBundle\Crawler\Messenger\Message\CrawlSitemapMessage", "retryCount" => 1, "delay" => 1000, "error" => "Event ""Symfony\Component\Messenger\Middleware\HandleMessageMiddleware" on "messenger.bus.default"" is not started.", "exception" => LogicException { #message: "Event ""Symfony\Component\Messenger\Middleware\HandleMessageMiddleware" on "messenger.bus.default"" is not started." #code: 0 #file: "./vendor/symfony/symfony/src/Symfony/Component/Stopwatch/Section.php" #line: 142 trace: { ./vendor/symfony/symfony/src/Symfony/Component/Stopwatch/Section.php:142 { …} ./vendor/symfony/symfony/src/Symfony/Component/Stopwatch/Stopwatch.php:126 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/Middleware/TraceableMiddleware.php:75 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php:83 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php:74 { …} ./src/Middleware/ResetApplicationMiddlerwareMiddleware.php:14 { AppBundle\Middleware\ResetApplicationMiddlerwareMiddleware->handle(Envelope $envelope, StackInterface $stack): Envelope^ › echo "couocu"; › return $stack->next()->handle($envelope, $stack); › } } ./vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Messenger/DoctrinePingConnectionMiddleware.php:34 { …} ./vendor/symfony/symfony/src/Symfony/Bridge/Doctrine/Messenger/AbstractDoctrineMiddleware.php:45 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/Middleware/FailedMessageProcessingMiddleware.php:34 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/Middleware/DispatchAfterCurrentBusMiddleware.php:68 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/Middleware/RejectRedeliveredMessageMiddleware.php:48 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/Middleware/AddBusNameStampMiddleware.php:37 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/Middleware/TraceableMiddleware.php:43 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/MessageBus.php:80 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/TraceableMessageBus.php:41 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/RoutableMessageBus.php:54 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/Worker.php:114 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/Worker.php:77 { …} ./vendor/symfony/symfony/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php:198 { …} ./vendor/symfony/symfony/src/Symfony/Component/Console/Command/Command.php:255 { …} ./vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:989 { …} ./vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Console/Application.php:96 { …} ./vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:290 { …} ./vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Console/Application.php:82 { …} ./vendor/symfony/symfony/src/Symfony/Component/Console/Application.php:166 { …} ./bin/console:29 { …} } } ] ``` </details> Commits ------- bf4b0cc [Messenger] Fix stopwach usage if it has been reset
2 parents fc794e5 + bf4b0cc commit bbe1bb7

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

src/Symfony/Component/Messenger/Middleware/TraceableMiddleware.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public function __construct(StackInterface $stack, Stopwatch $stopwatch, string
7171
*/
7272
public function next(): MiddlewareInterface
7373
{
74-
if (null !== $this->currentEvent) {
74+
if (null !== $this->currentEvent && $this->stopwatch->isStarted($this->currentEvent)) {
7575
$this->stopwatch->stop($this->currentEvent);
7676
}
7777

src/Symfony/Component/Messenger/Tests/Middleware/TraceableMiddlewareTest.php

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
4242
};
4343

4444
$stopwatch = $this->createMock(Stopwatch::class);
45-
$stopwatch->expects($this->once())->method('isStarted')->willReturn(true);
45+
$stopwatch->expects($this->exactly(2))->method('isStarted')->willReturn(true);
4646
$stopwatch->expects($this->exactly(2))
4747
->method('start')
4848
->withConsecutive(
@@ -91,4 +91,36 @@ public function testHandleWithException()
9191
$traced = new TraceableMiddleware($stopwatch, $busId);
9292
$traced->handle(new Envelope(new DummyMessage('Hello')), new StackMiddleware(new \ArrayIterator([null, $middleware])));
9393
}
94+
95+
public function testHandleWhenStopwatchHasBeenReset()
96+
{
97+
$busId = 'command_bus';
98+
$envelope = new Envelope(new DummyMessage('Hello'));
99+
100+
$stopwatch = new Stopwatch();
101+
102+
$middleware = new class($stopwatch) implements MiddlewareInterface {
103+
public $calls = 0;
104+
private $stopwatch;
105+
106+
public function __construct(Stopwatch $stopwatch)
107+
{
108+
$this->stopwatch = $stopwatch;
109+
}
110+
111+
public function handle(Envelope $envelope, StackInterface $stack): Envelope
112+
{
113+
$this->stopwatch->reset();
114+
115+
++$this->calls;
116+
117+
return $stack->next()->handle($envelope, $stack);
118+
}
119+
};
120+
121+
$traced = new TraceableMiddleware($stopwatch, $busId);
122+
123+
$traced->handle($envelope, new StackMiddleware(new \ArrayIterator([null, $middleware])));
124+
$this->assertSame(1, $middleware->calls);
125+
}
94126
}

0 commit comments

Comments
 (0)