为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

尚方宝剑之说 2023-07-19 16:52:21
我有一个 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 消息时,消息正文没有更改,而我添加到修改后的消息中的标头正在正确反映。我还可以在兔子处理程序中处理或修改我的消息,但我不想更改恢复程序和重试处理程序中的任何内容,因为其他侦听器也使用了这些处理程序。有人可以帮我解决这个问题吗?为什么我收到的是原始消息正文而不是修改后的消息正文?Spring-amqp 在这里使用任何克隆对象吗?当侦听器抛出异常时,是否有其他方法可以使用 spring-amqp 修改我的 RabbitMq 消息正文?
查看完整描述

1 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

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

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

解决方法:

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

希望能帮助到你。


查看完整回答
反对 回复 2023-07-19
  • 1 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信