gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:29:28 24 4
gpt4 key购买 nike

我有一个 Spring 应用程序,我们使用 spring-amqp 发布和监听来自 Rabbitmq 的消息。如果我的监听器抛出异常,我想修改我的 Rabbitmq 消息。当监听器抛出异常时,将使用恢复器和重试处理程序将其重新捕获。我正在修改监听器类中存在的 catch block 中的消息。一旦消息被修改,我就会抛出异常,以便在一段固定的时间后再次重试该消息。

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

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 消息时,消息正文没有更改,而我添加到修改后的消息中的 header 正在正确反射(reflect)。我还可以在兔子处理程序中处理或修改我的消息,但我不想更改恢复程序和重试处理程序中的任何内容,因为其他监听器也使用了这些处理程序。有人可以帮我解决这个问题吗?为什么我收到的是原始消息正文而不是修改后的消息正文? Spring-amqp 在这里使用任何克隆对象吗?

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

最佳答案

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

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

解决方法:

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

希望有帮助。

关于java - 当rabbit监听器抛出异常时,无法修改spring-amqp中的rabbitmq消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57873376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com