Closed
Description
Symfony version(s) affected: 4.3.2
(Updated to 4.3.5
)
Description
Error when using Symfony serializer and throwing an exception on a message handler
How to reproduce
Send a message using Symfony serializer in JSON format (in one microservice) and throwing any exception in the handler (second microservice).
Producer config:
framework:
messenger:
serializer:
default_serializer: messenger.transport.symfony_serializer
symfony_serializer:
format: json
context: { }
transports:
amqp:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
serializer: messenger.transport.symfony_serializer
routing:
'Holiday\Messenger\Message\WorkerHoliday': amqp
Consumer config:
framework:
messenger:
serializer:
default_serializer: messenger.transport.symfony_serializer
symfony_serializer:
format: json
context: { }
failure_transport: failed
transports:
amqp:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
serializer: Punch\Serializer\Messenger\EventSerializer
failed:
dsn: 'doctrine://default?queue_name=failed'
routing:
'Punch\Messenger\Message\WorkerHoliday': amqp
Consumer handler:
class WorkerHolidayHandler implements MessageHandlerInterface
{
public function __invoke(WorkerHoliday $message): void
{
if (null !== $message) {
throw new \AMQPException('Fail!');
}
}
}
Custom EventSerializer (where the error happens):
class EventSerializer extends Serializer
{
/**
* {@inheritdoc}
*/
public function encode(Envelope $envelope): array
{
$data = parent::encode($envelope);
$data['headers']['type'] = $this->parseType($data['headers']['type']);
return $data;
}
public function decode(array $encodedEnvelope): Envelope
{
$translatedType = $this->translateType($encodedEnvelope['headers']['type']);
$encodedEnvelope['headers']['type'] = $translatedType;
return parent::decode($encodedEnvelope);
}
private function parseType(string $type)
{
return end(explode('\\', $type));
}
private function translateType($type)
{
$map = ['Holiday\Messenger\Message\WorkerHoliday' => WorkerHoliday::class];
if (\array_key_exists($type, $map)) {
return $map[$type];
}
return $type;
}
}
Output on bin/console messenger:consume amqp -vv
:
09:22:36 INFO [messenger] Received message Punch\Messenger\Message\WorkerHoliday ["message" => Punch\Messenger\Message\WorkerHoliday^ { …},"class" => "Punch\Messenger\Message\WorkerHoliday"]
09:22:36 ERROR [messenger] Error thrown while handling message Punch\Messenger\Message\WorkerHoliday. Dispatching for retry #1 using 1000 ms delay. Error: "On man!" ["message" => Punch\Messenger\Message\WorkerHoliday^ { …},"class" => "Punch\Messenger\Message\WorkerHoliday","retryCount" => 1,"delay" => 1000,"error" => "On man!","exception" => Symfony\Component\Messenger\Exception\HandlerFailedException^ { …}]
09:22:36 INFO [messenger] Sending message Punch\Messenger\Message\WorkerHoliday with Symfony\Component\Messenger\Transport\AmqpExt\AmqpTransport ["message" => Punch\Messenger\Message\WorkerHoliday^ { …},"class" => "Punch\Messenger\Message\WorkerHoliday","sender" => "Symfony\Component\Messenger\Transport\AmqpExt\AmqpTransport"]
09:22:36 NOTICE [app] Ending job "messenger:consume"
In EventSerializer.php line 36:
[ErrorException]
Notice: Only variables should be passed by reference
Exception trace:
at /Users/jgonzalez/www/punch/src/api/src/Serializer/Messenger/EventSerializer.php:36
Punch\Serializer\Messenger\EventSerializer->parseType() at /Users/jgonzalez/www/punch/src/api/src/Serializer/Messenger/EventSerializer.php:20
Punch\Serializer\Messenger\EventSerializer->encode() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/Transport/AmqpExt/AmqpSender.php:44
Symfony\Component\Messenger\Transport\AmqpExt\AmqpSender->send() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/Transport/AmqpExt/AmqpTransport.php:68
Symfony\Component\Messenger\Transport\AmqpExt\AmqpTransport->send() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/Middleware/SendMessageMiddleware.php:76
Symfony\Component\Messenger\Middleware\SendMessageMiddleware->handle() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/Middleware/FailedMessageProcessingMiddleware.php:36
Symfony\Component\Messenger\Middleware\FailedMessageProcessingMiddleware->handle() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/Middleware/DispatchAfterCurrentBusMiddleware.php:67
Symfony\Component\Messenger\Middleware\DispatchAfterCurrentBusMiddleware->handle() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/Middleware/AddBusNameStampMiddleware.php:39
Symfony\Component\Messenger\Middleware\AddBusNameStampMiddleware->handle() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/Middleware/TraceableMiddleware.php:45
Symfony\Component\Messenger\Middleware\TraceableMiddleware->handle() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/MessageBus.php:73
Symfony\Component\Messenger\MessageBus->dispatch() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/TraceableMessageBus.php:43
Symfony\Component\Messenger\TraceableMessageBus->dispatch() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/RoutableMessageBus.php:59
Symfony\Component\Messenger\RoutableMessageBus->dispatch() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/Worker.php:161
Symfony\Component\Messenger\Worker->handleMessage() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/Worker.php:95
Symfony\Component\Messenger\Worker->run() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/Worker/StopWhenRestartSignalIsReceived.php:54
Symfony\Component\Messenger\Worker\StopWhenRestartSignalIsReceived->run() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/messenger/Command/ConsumeMessagesCommand.php:230
Symfony\Component\Messenger\Command\ConsumeMessagesCommand->execute() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/console/Command/Command.php:255
Symfony\Component\Console\Command\Command->run() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/console/Application.php:952
Symfony\Component\Console\Application->doRunCommand() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/framework-bundle/Console/Application.php:87
Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/console/Application.php:273
Symfony\Component\Console\Application->doRun() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/framework-bundle/Console/Application.php:73
Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at /Users/jgonzalez/www/punch/src/api/vendor/symfony/console/Application.php:149
Symfony\Component\Console\Application->run() at /Users/jgonzalez/www/punch/src/api/bin/console:42