Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当rabbit侦听器引发异常时,无法在spring amqp中修改rabbitmq消息_Java_Spring_Rabbitmq_Spring Amqp - Fatal编程技术网

Java 当rabbit侦听器引发异常时,无法在spring amqp中修改rabbitmq消息

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

我有一个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();

        }
    }

当我的recoverer接收到RabbitMq消息时,消息体没有更改,而我添加到修改后的消息中的头得到了正确的反映。 我还可以在rabbit处理程序中处理或修改我的消息,但我不想在recoverer和retry处理程序中更改任何内容,因为其他侦听器也使用了这些处理程序。 有人能帮我解决这个问题吗。为什么我接收的是原始邮件正文而不是修改后的邮件正文?Spring amqp是否在这里使用任何克隆对象


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

一旦消息体发送到RabbitMq队列,就不能修改它

如果消费者接受,即无错误,则从队列中删除消息。如果使用者未正确使用该消息,即出错时,RabbitMQ将对该消息重新排队(如果启用了自动重新排队)

解决方法:

您可以在消息已成功使用时通知RabbitMQ,但可以克隆该消息并将其作为新消息重新发送


希望有帮助。

在将邮件重新排队到兔子队列的过程中,我的邮件正文保持不变,但邮件标题已更新。因此,在将消息重新排队到队列的情况下,如何修改消息头?我们是否只允许修改标题,而不允许修改消息体?作为消息体和消息头,它们都被注入到类message的同一个对象中,如何只更新消息头而不更新消息体?请参阅,RabbitMQ保证消息的传递。为了实现这一点,它跟踪发送给消费者并等待确认(肯定或否定)的消息。如果它得到neg ack,它将从它自己的副本中对同一消息重新排队,但是,它允许您修改标题以供使用。(1/2..阅读下一条注释)每个队列/交换机都有不同的配置,您可以将失败的消息自动路由到不同的队列,或者可以对长时间未传递的消息设置超时。。这些信息主要存储在标题中,但一旦发送,正文就不能更改,就像Whatsapp消息或推文一样,您可以发送它,不能修改它。这也确保了数据(消息体)的不变性。如果你对答案感到满意,你可以接受答案。或者有任何疑问,请随时提问。将一起学习:)