我有一个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消息正文?
答案 0 :(得分:1)
消息正文一旦发送到RabbitMQ队列,就无法修改。
如果消费者接受它,即没有错误,它将从队列中删除消息。如果消费者未正确使用它,即由于错误,RabbitMQ将对消息重新排队(如果启用了自动重新排队)。
解决方法:
您可以通知RabbitMQ消息已被成功使用,但是您可以克隆消息并将消息重新发送为新消息。
希望,它会有所帮助。