我在 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”。并且没有任何问题。
如果我删除标记(设置为空数组),消息会多次复制到“队列”中,直到我停止消费者的运行。
出了什么问题? 非常感谢你
我有完全相同的问题,你找到解决方案了吗?谢谢