当 rabbit 侦听器抛出异常时,无法在 spring-amqp 中修改 rabbitmq 消息
Not able to modify rabbitmq message in spring-amqp,when rabbit listener throws an exception
我有一个 spring 应用程序,我们使用 spring-amqp 从 Rabbitmq 发布和监听消息。如果我的侦听器抛出异常,我想修改我的 Rabbitmq 消息。当侦听器抛出异常时,它将使用恢复器和重试处理程序重新绑定。我正在修改监听器 class 中存在的 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 消息时,消息的 body 没有改变,而我添加到修改后的消息中的 headers 得到正确反映。
我也可以在兔子处理程序中处理或修改我的消息,但我不想更改恢复器和重试处理程序中的任何内容,因为其他侦听器也使用了这些。
有人可以帮我解决这个问题吗?为什么我收到的是原始消息 body 而不是修改后的消息 body? Spring-amqp 在这里使用任何克隆的 object 吗?
当侦听器抛出异常时,是否有任何其他方法可以使用 spring-amqp 修改我的 RabbitMq 消息 body?
一旦发送到 RabbitMQ 队列,您将无法修改消息体。
如果它被消费者接受,即没有错误,它会从队列中删除消息。如果消费者没有正确使用它,即出错,RabbitMQ 会重新排队消息(如果启用了自动重新排队)。
解决方法:
您可以通知 RabbitMQ 消息已成功使用,但您可以克隆该消息并重新发送该消息作为新消息。
希望对你有帮助。
我有一个 spring 应用程序,我们使用 spring-amqp 从 Rabbitmq 发布和监听消息。如果我的侦听器抛出异常,我想修改我的 Rabbitmq 消息。当侦听器抛出异常时,它将使用恢复器和重试处理程序重新绑定。我正在修改监听器 class 中存在的 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 消息时,消息的 body 没有改变,而我添加到修改后的消息中的 headers 得到正确反映。 我也可以在兔子处理程序中处理或修改我的消息,但我不想更改恢复器和重试处理程序中的任何内容,因为其他侦听器也使用了这些。 有人可以帮我解决这个问题吗?为什么我收到的是原始消息 body 而不是修改后的消息 body? Spring-amqp 在这里使用任何克隆的 object 吗?
当侦听器抛出异常时,是否有任何其他方法可以使用 spring-amqp 修改我的 RabbitMq 消息 body?
一旦发送到 RabbitMQ 队列,您将无法修改消息体。
如果它被消费者接受,即没有错误,它会从队列中删除消息。如果消费者没有正确使用它,即出错,RabbitMQ 会重新排队消息(如果启用了自动重新排队)。
解决方法:
您可以通知 RabbitMQ 消息已成功使用,但您可以克隆该消息并重新发送该消息作为新消息。
希望对你有帮助。