| Q | A |
|---|
| Branch? | 6.2 |
| Bug fix? | yes |
| New feature? | yes |
| Deprecations? | no |
| Tickets | |
| License | MIT |
| Doc PR | |
It's easier to review the pr with?w=1
Why?
This PR aimed to handle properly messaged that are already failed and alsonot decodable anymore.
This use case occurs when a Message class is renamed / moved to another namespace
Reproducer
- Publish many message of type
App\Message\Foobar - Consume them all, but throw an Exception exception in the handler
- Renamed
Foobar toFoo
Before / After
commandmessenger:failed:show
Before
Without an ID
…abs/symfony/messenger-class-not-found(new) bin/console messenger:failed:showThere are 94 messages pending in the failure transport.In PhpSerializer.php line 84: Message class "App\Message\Foobar" not found during decoding.messenger:failed:show [--max MAX] [--transport [TRANSPORT]] [--stats] [--class-filter CLASS-FILTER] [--] [<id>]
And thismessage is lost
With an ID
>…abs/symfony/messenger-class-not-found(new) bin/console messenger:failed:show 68There are 93 messages pending in the failure transport.In PhpSerializer.php line 84: Message class "App\Message\Foobar" not found during decoding.messenger:failed:show [--max MAX] [--transport [TRANSPORT]] [--stats] [--class-filter CLASS-FILTER] [--] [<id>]
Message lost too
After
Without an ID
>…goire/dev/labs/symfony/symfony-5.2(remaned) bin/console messenger:failed:showThere are 94 messages pending in the failure transport. ----- ------------------------ --------------------- --------------------------------------- Id Class Failed at Error ----- ------------------------ --------------------- --------------------------------------- 62 __PHP_Incomplete_Class 2022-08-12 16:26:06 FoobarHandler is not implemented yet. 63 __PHP_Incomplete_Class 2022-08-12 16:26:06 FoobarHandler is not implemented yet. 64 __PHP_Incomplete_Class 2022-08-12 16:26:06 FoobarHandler is not implemented yet. // Showing first 50 messages. // Run messenger:failed:show {id} --transport=failed -vv to see message details.
No messages are lost
With an ID
>…abs/symfony/messenger-class-not-found(new) bin/console messenger:failed:show 69There are 92 messages pending in the failure transport.Failed Message Details====================== ------------- --------------------------------------- Class __PHP_Incomplete_Class Message Id 69 Failed at 2022-08-12 16:26:06 Error FoobarHandler is not implemented yet. Error Code 0 Error Class Exception Transport async ------------- --------------------------------------- Message history: * Message failed at 2022-08-12 16:25:58 and was redelivered * Message failed at 2022-08-12 16:25:59 and was redelivered * Message failed at 2022-08-12 16:26:02 and was redelivered * Message failed at 2022-08-12 16:26:06 and was redelivered [ERROR] The message could not be decoded. Re-run command with -vv to see more message & error details. Run messenger:failed:retry 69 --transport=failed to retry this message. Run messenger:failed:remove 69 --transport=failed to delete it.
messages not lost
With an ID an -vv
>…abs/symfony/messenger-class-not-found(new) bin/console messenger:failed:show 69 -vvThere are 92 messages pending in the failure transport.Failed Message Details====================== ------------- --------------------------------------- Class __PHP_Incomplete_Class Message Id 69 Failed at 2022-08-12 16:26:06 Error FoobarHandler is not implemented yet. Error Code 0 Error Class Exception Transport async ------------- --------------------------------------- Message history: * Message failed at 2022-08-12 16:25:58 and was redelivered * Message failed at 2022-08-12 16:25:59 and was redelivered * Message failed at 2022-08-12 16:26:02 and was redelivered * Message failed at 2022-08-12 16:26:06 and was redeliveredMessage:======== [ERROR] The message could not be decoded. See below an APPROXIMATIVE representation of the class.__PHP_Incomplete_Class(App\Message\Foobar) {}Exception:==========Exception^ { message: "FoobarHandler is not implemented yet." code: 0 file: "/home/gregoire/dev/labs/symfony/messenger-class-not-found/src/MessageHandler/FoobarHandler.php" line: 12 trace: { /home/gregoire/dev/labs/symfony/messenger-class-not-found/src/MessageHandler/FoobarHandler.php:12 /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Messenger/Middleware/HandleMessageMiddleware.php:95 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Messenger/Middleware/SendMessageMiddleware.php:71 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Messenger/Middleware/FailedMessageProcessingMiddleware.php:34 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Messenger/Middleware/DispatchAfterCurrentBusMiddleware.php:68 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Messenger/Middleware/RejectRedeliveredMessageMiddleware.php:41 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Messenger/Middleware/AddBusNameStampMiddleware.php:37 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Messenger/Middleware/TraceableMiddleware.php:43 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Messenger/MessageBus.php:73 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Messenger/TraceableMessageBus.php:41 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Messenger/RoutableMessageBus.php:54 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Messenger/Worker.php:156 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Messenger/Worker.php:105 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Messenger/Command/ConsumeMessagesCommand.php:223 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Console/Command/Command.php:309 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Console/Application.php:1019 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Bundle/FrameworkBundle/Console/Application.php:94 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Console/Application.php:300 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Bundle/FrameworkBundle/Console/Application.php:80 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Console/Application.php:172 { …} /home/gregoire/dev/github.com/lyrixx/symfony/src/Symfony/Component/Runtime/Runner/Symfony/ConsoleApplicationRunner.php:54 { …} ./vendor/autoload_runtime.php:29 { …} ./bin/console:11 { …} }} Run messenger:failed:retry 69 --transport=failed to retry this message. Run messenger:failed:remove 69 --transport=failed to delete it.
screenshot with colors

messages not lost
commandmessenger:failed:retry
Before
>…abs/symfony/messenger-class-not-found(new) bin/console messenger:failed:retry 69 // Quit this command with CONTROL-C. // Re-run the command with a -vv option to see logs about consumed messages.There are 92 messages pending in the failure transport.To retry all the messages, run messenger:consume failedIn PhpSerializer.php line 84: Message class "App\Message\Foobar" not found during decoding.messenger:failed:retry [--force] [--transport [TRANSPORT]] [--] [<id>...]
And the first message is lost
Same if I use an ID
After
Without ID
>…abs/symfony/messenger-class-not-found(new) bin/console messenger:failed:retry // Quit this command with CONTROL-C. // Re-run the command with a -vv option to see logs about consumed messages.There are 91 messages pending in the failure transport.To retry all the messages, run messenger:consume failedFailed Message Details====================== ------------- --------------------------------------- Class __PHP_Incomplete_Class Message Id 63 Failed at 2022-08-12 16:26:06 Error FoobarHandler is not implemented yet. Error Code 0 Error Class Exception Transport async ------------- --------------------------------------- Message history: * Message failed at 2022-08-12 16:25:58 and was redelivered * Message failed at 2022-08-12 16:25:59 and was redelivered * Message failed at 2022-08-12 16:26:02 and was redelivered * Message failed at 2022-08-12 16:26:06 and was redelivered [ERROR] The message could not be decoded. Re-run command with -vv to see more message & error details.In FailedMessagesRetryCommand.php line 176: The message with id "63" could not decoded, it can only be shown or removed.messenger:failed:retry [--force] [--transport [TRANSPORT]] [--] [<id>...]
And the message is not lost
With an ID
>…abs/symfony/messenger-class-not-found(new) bin/console messenger:failed:retry 63 // Quit this command with CONTROL-C. // Re-run the command with a -vv option to see logs about consumed messages.There are 91 messages pending in the failure transport.To retry all the messages, run messenger:consume failedFailed Message Details====================== ------------- --------------------------------------- Class __PHP_Incomplete_Class Message Id 63 Failed at 2022-08-12 16:26:06 Error FoobarHandler is not implemented yet. Error Code 0 Error Class Exception Transport async ------------- --------------------------------------- Message history: * Message failed at 2022-08-12 16:25:58 and was redelivered * Message failed at 2022-08-12 16:25:59 and was redelivered * Message failed at 2022-08-12 16:26:02 and was redelivered * Message failed at 2022-08-12 16:26:06 and was redelivered [ERROR] The message could not be decoded. Re-run command with -vv to see more message & error details.In FailedMessagesRetryCommand.php line 176: The message with id "63" could not decoded, it can only be shown or removed.messenger:failed:retry [--force] [--transport [TRANSPORT]] [--] [<id>...]
commandmessenger:failed:remove
Before
>…abs/symfony/messenger-class-not-found(new) bin/console messenger:failed:remove 63In PhpSerializer.php line 84: Message class "App\Message\Foobar" not found during decoding.messenger:failed:remove [--force] [--transport [TRANSPORT]] [--show-messages] [--] <id>...
The message is lost, but it's not an issue I guess :p
After
>…abs/symfony/messenger-class-not-found(new) bin/console messenger:failed:remove 69 [ERROR] The message with id "69" was not found.>…abs/symfony/messenger-class-not-found(new) bin/console messenger:failed:remove 79Failed Message Details====================== ------------- --------------------------------------- Class __PHP_Incomplete_Class Message Id 79 Failed at 2022-08-12 16:26:06 Error FoobarHandler is not implemented yet. Error Code 0 Error Class Exception Transport async ------------- --------------------------------------- Message history: * Message failed at 2022-08-12 16:25:58 and was redelivered * Message failed at 2022-08-12 16:25:59 and was redelivered * Message failed at 2022-08-12 16:26:02 and was redelivered * Message failed at 2022-08-12 16:26:06 and was redelivered [ERROR] The message could not be decoded. Re-run command with -vv to see more message & error details. Do you want to permanently remove this message? (yes/no) [no]: > yes [OK] Message with id 79 removed.
Extra
messenger:consume command
This command is not fixed on purpose: We keep the default behavior to keep a BC.
BUT I would like to use the same stamp system I introduce to avoid loosing a message.
Because ATM, when a DecodeException is thrown, the message is lost. Not cool!
>…goire/dev/labs/symfony/symfony-5.2(remaned) bin/console messenger:consume failed [OK] Consuming messages from transports "failed". // The worker will automatically exit once it has received a stop signal via the messenger:stop-workers command. // Quit the worker with CONTROL-C. // Re-run the command with a -vv option to see logs about consumed messages.In PhpSerializer.php line 92: Message class "App\Message\Foobar" not found during decoding.
Uh oh!
There was an error while loading.Please reload this page.
It's easier to review the pr with
?w=1Why?
This PR aimed to handle properly messaged that are already failed and alsonot decodable anymore.
This use case occurs when a Message class is renamed / moved to another namespace
Reproducer
App\Message\FoobarFoobartoFooBefore / After
command
messenger:failed:showBefore
Without an ID
And thismessage is lost
With an ID
Message lost too
After
Without an ID
No messages are lost
With an ID
messages not lost
With an ID an -vv
screenshot with colors
messages not lost
command
messenger:failed:retryBefore
And the first message is lost
Same if I use an ID
After
Without ID
And the message is not lost
With an ID
command
messenger:failed:removeBefore
The message is lost, but it's not an issue I guess :p
After
Extra
messenger:consumecommandThis command is not fixed on purpose: We keep the default behavior to keep a BC.
BUT I would like to use the same stamp system I introduce to avoid loosing a message.
Because ATM, when a DecodeException is thrown, the message is lost. Not cool!