Symfony Messenger 与 RabbitMQ JsonSerialize 重新排队问题

问题描述 投票:0回答:1

我在 Rabbit 中创建了 2 个队列。第一个如果是main,第二个应该在consumer中抛出异常时使用。在较旧的 Symfony 上,使用 ampq 捆绑包一切正常,但在 6.2 中使用 Messenger 则不行。 JsonSerializer 有问题。我按照 Symfony 手册推荐的“复制/粘贴”解决方案。 让我们使用这个参数创建第一个名为queue的队列(第二个是queue_retry,但此时并不重要):

arguments:
    x-dead-letter-exchange: 'queue_retry'
    x-dead-letter-routing-key: ''

还有 JsonSerializer 类

class RabbitMessageMessengerJsonSerializer implements SerializerInterface
{
    public function decode(array $encodedEnvelope): Envelope
    {
        $body = $encodedEnvelope['body'];
        $headers = $encodedEnvelope['headers'];
        $data = json_decode($body, true);

        $message = new RabbitMessageMessenger($data);

        $envelope = new Envelope($message);

        $stamps = [];
        if (isset($headers['stamps'])) {
            $stamps = unserialize($headers['stamps']);
        }

        return $envelope->with(... $stamps);
    }

    public function encode(Envelope $envelope): array
    {
        $message = $envelope->getMessage();
        if ($message instanceof RabbitMessageMessenger) {
            $data = $message->getContent();
        } else {
            throw new \Exception('Unsupported message class');
        }

        $allStamps = [];
        foreach ($envelope->all() as $stamps) {
            $allStamps = array_merge($allStamps, $stamps);
        }

        return [
            'body' => json_encode($data),
            'headers' => [
                'stamps' => serialize($allStamps),
            ],
        ];
    }
}

当我运行消费者并抛出异常时,我收到以下消息: 在 RabbitMessageMessengerJsonSerializer.php 第 46 行:

[例外] 不允许序列化“Closure”

在这种情况下,消息已“复制”并存在于两个队列中。我需要从“队列”中取出它,当它失败时“移动”到“queue_retry”。并且没有任何问题。

如果我删除标记(设置为空数组),消息会多次复制到“队列”中,直到我停止消费者的运行。

出了什么问题? 非常感谢你

symfony jsonserializer symfony-messenger
1个回答
0
投票

我有完全相同的问题,你找到解决方案了吗?谢谢

© www.soinside.com 2019 - 2024. All rights reserved.