Skip to content

[Messenger | ErrorHandler] JSON serialization + ErrorDetailsStamp doesn't seem to deserialize correctly #39003

Closed
@Jean85

Description

@Jean85

Symfony version(s) affected: 5.2.x (just updated, so dc0d45d)

Description
Follow-up from #38792. I'm using the messenger with the JSON serializer, and in case of errors the deserialization of the errored message fails:

In Serializer.php line 122:      
                                                                                                    
  [Symfony\Component\Messenger\Exception\MessageDecodingFailedException]                                                                                                                                   
  Could not decode stamp: Cannot create an instance of "Symfony\Component\Messenger\Stamp\ErrorDetailsStamp" 
  from serialized data because its constructor requires parameter "throwable" to be present.                                                                                             

Exception trace:
 at vendor/symfony/messenger/Transport/Serialization/Serializer.php:122
 Symfony\Component\Messenger\Transport\Serialization\Serializer->decodeStamps() at vendor/symfony/messenger/Transport/Serialization/Serializer.php:73
 Symfony\Component\Messenger\Transport\Serialization\Serializer->decode() at vendor/symfony/amazon-sqs-messenger/Transport/AmazonSqsReceiver.php:55
 Symfony\Component\Messenger\Bridge\AmazonSqs\Transport\AmazonSqsReceiver->get() at vendor/symfony/messenger/Worker.php:74
 Symfony\Component\Messenger\Worker->run() at vendor/symfony/messenger/Command/ConsumeMessagesCommand.php:198
 Symfony\Component\Messenger\Command\ConsumeMessagesCommand->execute() at vendor/symfony/console/Command/Command.php:255
 Symfony\Component\Console\Command\Command->run() at vendor/symfony/console/Application.php:989
 Symfony\Component\Console\Application->doRunCommand() at vendor/symfony/framework-bundle/Console/Application.php:96
 Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() at vendor/symfony/console/Application.php:290
 Symfony\Component\Console\Application->doRun() at vendor/symfony/framework-bundle/Console/Application.php:82
 Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at vendor/symfony/console/Application.php:166
 Symfony\Component\Console\Application->run() at bin/console:42

In AbstractNormalizer.php line 394:

  [Symfony\Component\Serializer\Exception\MissingConstructorArgumentsException]                     
  Cannot create an instance of "Symfony\Component\Messenger\Stamp\ErrorDetailsStamp" from serialized
  data because its constructor requires parameter "throwable" to be present.

Exception trace:
  at vendor/symfony/serializer/Normalizer/AbstractNormalizer.php:394
 Symfony\Component\Serializer\Normalizer\AbstractNormalizer->instantiateObject() at vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php:233
 Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer->instantiateObject() at vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php:311
 Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer->denormalize() at vendor/symfony/serializer/Serializer.php:205
 Symfony\Component\Serializer\Serializer->denormalize() at vendor/symfony/serializer/Normalizer/ArrayDenormalizer.php:60
 Symfony\Component\Serializer\Normalizer\ArrayDenormalizer->denormalize() at vendor/symfony/serializer/Serializer.php:205
 Symfony\Component\Serializer\Serializer->denormalize() at vendor/symfony/serializer/Serializer.php:144
 Symfony\Component\Serializer\Serializer->deserialize() at vendor/symfony/messenger/Transport/Serialization/Serializer.php:120
 Symfony\Component\Messenger\Transport\Serialization\Serializer->decodeStamps() at vendor/symfony/messenger/Transport/Serialization/Serializer.php:73
 Symfony\Component\Messenger\Transport\Serialization\Serializer->decode() at vendor/symfony/amazon-sqs-messenger/Transport/AmazonSqsReceiver.php:55
 Symfony\Component\Messenger\Bridge\AmazonSqs\Transport\AmazonSqsReceiver->get() at vendor/symfony/messenger/Worker.php:74
 Symfony\Component\Messenger\Worker->run() at vendor/symfony/messenger/Command/ConsumeMessagesCommand.php:198
 Symfony\Component\Messenger\Command\ConsumeMessagesCommand->execute() at vendor/symfony/console/Command/Command.php:255
 Symfony\Component\Console\Command\Command->run() at vendor/symfony/console/Application.php:989
 Symfony\Component\Console\Application->doRunCommand() at vendor/symfony/framework-bundle/Console/Application.php:96
 Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() at vendor/symfony/console/Application.php:290
 Symfony\Component\Console\Application->doRun() at vendor/symfony/framework-bundle/Console/Application.php:82
 Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at vendor/symfony/console/Application.php:166
 Symfony\Component\Console\Application->run() at bin/console:42

How to reproduce

  • Configure the transport with serializer: Symfony\Component\Messenger\Transport\Serialization\Serializer
  • Dispatch any message
  • make the message fail (a simple throw new \Exception(); will suffice)
  • try to handle the failed message, either with a simple retry or from the failed transport

Possible Solution
Use a named constructor to create the stamp, and make the constructor without any arguments?

Additional context
Follow-up from #38792; I updated to 5.2.x as a workaround and I got this failure.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions