Skip to content

[Messenger] Error when throwing exception on MessageHandler #34098

Closed
@juanwilde

Description

@juanwilde

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

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