兔子侦听器引发异常时,无法在spring-amqp中修改Rabbitmq消息

时间:2019-09-10 14:51:40

标签: java spring rabbitmq spring-amqp

我有一个spring应用程序,我们在其中使用spring-amqp发布和收听Rabbitmq的消息。如果侦听器引发异常,我想修改Rabbitmq消息。当侦听器引发异常时,将使用恢复器和重试处理程序将其淘汰。我正在侦听器类中存在的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消息时,该消息的主体未更改,而我添加到已修改消息中的标头正正确反映。 我还可以在Rabbit处理程序中处理或修改我的消息,但是我不想在恢复器和重试处理程序中进行任何更改,因为其他侦听器也使用了这些内容。 有人可以帮我解决这个问题。为什么我收到的是原始邮件正文,而不是修改后的邮件正文? Spring-amqp在这里使用任何克隆的对象吗?

当侦听器引发异常时,是否还有其他方法可以使用spring-amqp修改RabbitMq消息正文?

1 个答案:

答案 0 :(得分:1)

消息正文一旦发送到RabbitMQ队列,就无法修改。

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

解决方法:

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

希望,它会有所帮助。

相关问题