Java 当rabbit侦听器引发异常时,无法在spring amqp中修改rabbitmq消息
我有一个spring应用程序,我们使用spring amqp发布和侦听来自Rabbitmq的消息。如果侦听器引发异常,我想修改Rabbitmq消息。当侦听器抛出异常时,将使用恢复程序和重试处理程序对其进行重定时。我正在修改侦听器类中存在的catch块中的消息。一旦消息被修改,我将抛出一个异常,这样消息将在一段固定的时间后重试 下面是我用来修改消息的代码Java 当rabbit侦听器引发异常时,无法在spring amqp中修改rabbitmq消息,java,spring,rabbitmq,spring-amqp,Java,Spring,Rabbitmq,Spring Amqp,我有一个spring应用程序,我们使用spring amqp发布和侦听来自Rabbitmq的消息。如果侦听器引发异常,我想修改Rabbitmq消息。当侦听器抛出异常时,将使用恢复程序和重试处理程序对其进行重定时。我正在修改侦听器类中存在的catch块中的消息。一旦消息被修改,我将抛出一个异常,这样消息将在一段固定的时间后重试 下面是我用来修改消息的代码 public void onMessage(Message message, Channel channel) throws Exception
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();
}
}
当我的recoverer接收到RabbitMq消息时,消息体没有更改,而我添加到修改后的消息中的头得到了正确的反映。
我还可以在rabbit处理程序中处理或修改我的消息,但我不想在recoverer和retry处理程序中更改任何内容,因为其他侦听器也使用了这些处理程序。
有人能帮我解决这个问题吗。为什么我接收的是原始邮件正文而不是修改后的邮件正文?Spring amqp是否在这里使用任何克隆对象
当侦听器引发异常时,是否有其他方法可以使用spring amqp修改我的RabbitMq消息体?一旦消息体发送到RabbitMq队列,就不能修改它 如果消费者接受,即无错误,则从队列中删除消息。如果使用者未正确使用该消息,即出错时,RabbitMQ将对该消息重新排队(如果启用了自动重新排队) 解决方法: 您可以在消息已成功使用时通知RabbitMQ,但可以克隆该消息并将其作为新消息重新发送
希望有帮助。在将邮件重新排队到兔子队列的过程中,我的邮件正文保持不变,但邮件标题已更新。因此,在将消息重新排队到队列的情况下,如何修改消息头?我们是否只允许修改标题,而不允许修改消息体?作为消息体和消息头,它们都被注入到类message的同一个对象中,如何只更新消息头而不更新消息体?请参阅,RabbitMQ保证消息的传递。为了实现这一点,它跟踪发送给消费者并等待确认(肯定或否定)的消息。如果它得到neg ack,它将从它自己的副本中对同一消息重新排队,但是,它允许您修改标题以供使用。(1/2..阅读下一条注释)每个队列/交换机都有不同的配置,您可以将失败的消息自动路由到不同的队列,或者可以对长时间未传递的消息设置超时。。这些信息主要存储在标题中,但一旦发送,正文就不能更改,就像Whatsapp消息或推文一样,您可以发送它,不能修改它。这也确保了数据(消息体)的不变性。如果你对答案感到满意,你可以接受答案。或者有任何疑问,请随时提问。将一起学习:)