Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

[Messenger] Error when throwing exception on MessageHandler #34098

Copy link
Copy link
Closed
@juanwilde

Description

@juanwilde
Issue body actions

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

      Morty Proxy This is a proxified and sanitized view of the page, visit original site.