当 rabbit 侦听器抛出异常时,无法在 spring-amqp 中修改 rabbitmq 消息

Not able to modify rabbitmq message in spring-amqp,when rabbit listener throws an exception

我有一个 spring 应用程序,我们使用 spring-amqp 从 Rabbitmq 发布和监听消息。如果我的侦听器抛出异常,我想修改我的 Rabbitmq 消息。当侦听器抛出异常时,它将使用恢复器和重试处理程序重新绑定。我正在修改监听器 class 中存在的 catch 块中的消息。修改消息后,我将抛出异常,以便在固定的持续时间后再次重试消息。

这是我用来修改消息的代码。

public void onMessage(Message message, Channel channel) throws Exception
{
        try
        {

            if(message.getMessageProperties().getHeaders().get("x-retried-header") != null)//self defined header
            {
                throw new MyException();
            }
            else
            {
                //some logic
            }
        }
        catch(MyException e)
        {
            MyClass myObject = new MyClass();
            myObject.setMessage("Hello Message Is Being Retried");
            MessageProperties properties = message.getMessageProperties();
            properties.setHeader("x-retried-header", 1);
            message = MessageBuilder.withBody(myObject.toByteArray()).andProperties(properties).build();
            throw new Exception();

        }
    }

当我的恢复器收到 RabbitMq 消息时,消息的 body 没有改变,而我添加到修改后的消息中的 headers 得到正确反映。 我也可以在兔子处理程序中处理或修改我的消息,但我不想更改恢复器和重试处理程序中的任何内容,因为其他侦听器也使用了这些。 有人可以帮我解决这个问题吗?为什么我收到的是原始消息 body 而不是修改后的消息 body? Spring-amqp 在这里使用任何克隆的 object 吗?

当侦听器抛出异常时,是否有任何其他方法可以使用 spring-amqp 修改我的 RabbitMq 消息 body?

一旦发送到 RabbitMQ 队列,您将无法修改消息体。

如果它被消费者接受,即没有错误,它会从队列中删除消息。如果消费者没有正确使用它,即出错,RabbitMQ 会重新排队消息(如果启用了自动重新排队)。

解决方法:

您可以通知 RabbitMQ 消息已成功使用,但您可以克隆该消息并重新发送该消息作为新消息。

希望对你有帮助。