Skip to content

Commit ff872fd

Browse files
committed
feature #39622 [Messenger] Be able to get raw data when a message in not decodable by the PHP Serializer (lyrixx)
This PR was merged into the 6.2 branch. Discussion ---------- [Messenger] Be able to get raw data when a message in not decodable by the PHP Serializer | 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`](https://github.com/symfony/symfony/pull/39622/files?w=1) --- ## Why? This PR aimed to handle properly messaged that are already failed and also **not decodable** anymore. This use case occurs when a Message class is renamed / moved to another namespace ## Reproducer 1. Publish many message of type `App\Message\Foobar` 1. Consume them all, but throw an Exception exception in the handler 1. Renamed `Foobar` to `Foo` ## Before / After ### command `messenger:failed:show` #### Before ##### Without an ID ``` …abs/symfony/messenger-class-not-found(new) bin/console messenger:failed:show There 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 this **message is lost** ##### With an ID ``` >…abs/symfony/messenger-class-not-found(new) bin/console messenger:failed:show 68 There 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:show There 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 69 There 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 -vv There 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 Message: ======== [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. ``` <details> <summary>screenshot with colors</summary> ![screenshot with colors](https://user-images.githubusercontent.com/408368/187463971-a5464683-f826-4dcb-a2c2-79f91cb00bc0.png) </details> **messages not lost** ### command `messenger: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 failed In 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 failed Failed 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 failed Failed 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>...] ``` ### command `messenger:failed:remove` #### Before ``` >…abs/symfony/messenger-class-not-found(new) bin/console messenger:failed:remove 63 In 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 79 Failed 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. ``` Commits ------- 34229af21e [Messenger] Be able to get raw data when a message in not decodable by the PHP Serializer
2 parents 90b42f9 + a14ee40 commit ff872fd

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

Resources/config/console.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,20 +191,23 @@
191191
service('messenger.routable_message_bus'),
192192
service('event_dispatcher'),
193193
service('logger'),
194+
service('messenger.transport.native_php_serializer')->nullOnInvalid(),
194195
])
195196
->tag('console.command')
196197

197198
->set('console.command.messenger_failed_messages_show', FailedMessagesShowCommand::class)
198199
->args([
199200
abstract_arg('Default failure receiver name'),
200201
abstract_arg('Receivers'),
202+
service('messenger.transport.native_php_serializer')->nullOnInvalid(),
201203
])
202204
->tag('console.command')
203205

204206
->set('console.command.messenger_failed_messages_remove', FailedMessagesRemoveCommand::class)
205207
->args([
206208
abstract_arg('Default failure receiver name'),
207209
abstract_arg('Receivers'),
210+
service('messenger.transport.native_php_serializer')->nullOnInvalid(),
208211
])
209212
->tag('console.command')
210213

0 commit comments

Comments
 (0)