Closed
Description
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.