Spring integration SpringCloudStream:如何重新发布到死信队列并引发异常

Spring integration SpringCloudStream:如何重新发布到死信队列并引发异常,spring-integration,spring-cloud,spring-amqp,spring-cloud-stream,Spring Integration,Spring Cloud,Spring Amqp,Spring Cloud Stream,我正在将一个使用Spring AMQP的项目迁移到一个使用Spring Cloud Stream和RabbitMQ的项目 在我以前的项目中,当使用@RabbitListener处理消息时发生异常时,会引发该异常。如果绑定了死信队列,则仍然会抛出异常(如果重试,则只会抛出一次,我猜是最后一次)。这对于日志记录非常有用 在Spring Cloud中,如果您定义以下属性,则@StreamListener有一个死信队列机制: spring.cloud.stream.bindings.input1.des

我正在将一个使用Spring AMQP的项目迁移到一个使用Spring Cloud Stream和RabbitMQ的项目

在我以前的项目中,当使用@RabbitListener处理消息时发生异常时,会引发该异常。如果绑定了死信队列,则仍然会抛出异常(如果重试,则只会抛出一次,我猜是最后一次)。这对于日志记录非常有用

在Spring Cloud中,如果您定义以下属性,则@StreamListener有一个死信队列机制:

spring.cloud.stream.bindings.input1.destination=dest1
spring.cloud.stream.rabbit.bindings.input1.consumer.auto-bind-dlq=true
spring.cloud.stream.rabbit.bindings.input1.consumer.republishToDlq=true
但是如果您有这样一种方法(只是一个示例):

日志包括:

Trying...
Trying...
Trying...
(end of log, no exception thrown)
是否有任何方法抛出异常(仅在上次重试时)


谢谢

请参阅有关消费者属性的文档


…consumer.max attempts=1设置为禁用重试。

请参阅有关consumer属性的文档


设置
…consumer.max attempts=1
以禁用重试。

您可以处理异常,记录它,然后抛出AmqpRejectAndDontRequeueException。这将把消息发送到死信队列

您可以处理异常,记录它,然后抛出AmqpRejectAndDontRequeueException。这会将消息发送到死信队列

我想1)重试2)重试次数用尽时死信队列3)抛出最后一个异常,使用Spring AMQP时我拥有所有3项功能,您有
spring.cloud.stream.rabbit.bindings.input1.consumer.republishToDlq=true
,这意味着绑定器将消息重新发布到DLQ(并添加异常信息),而不是抛出异常,这会导致代理将其发送到DLQ,但没有异常信息。如果这是您想要的,请删除
republishToDlq
,使其默认为
false
。但如果我将republishToDql设置为false,则消息(毫无例外)不会在死信队列中重新发布。在文档()中,使用auto bind dlq=true似乎已经足够了,但如果我删除该属性,消息将永远不会到达死信队列。有两种选择-抛出异常,代理将原始消息发送到dlq或
repubishtodlq=true
,这意味着绑定器将消息发布到dlq,附加诊断信息(标题中的异常等)。自动绑定dlq只需设置dlq并将原始队列配置为在那里发送拒绝(用于引发异常时)。没有DLQ配置,队列不能已经存在;您无法在创建队列后更改它。这就是问题所在:“队列必须在没有DLQ配置的情况下不存在;您无法在创建队列后更改它”。谢谢我想1)重试2)当重试次数用尽时死队列字母3)抛出最后一个异常,我在使用Spring AMQP时拥有所有3项功能。嗯,您有
Spring.cloud.stream.rabbit.bindings.input1.consumer.republishToDlq=true
,这意味着绑定器将消息重新发布到DLQ(并添加异常信息)而不是抛出异常,这会导致代理将其发送到DLQ,但没有异常信息。如果这是您想要的,请删除
republishToDlq
,使其默认为
false
。但如果我将republishToDql设置为false,则消息(毫无例外)不会在死信队列中重新发布。在文档()中,使用auto bind dlq=true似乎已经足够了,但如果我删除该属性,消息将永远不会到达死信队列。有两种选择-抛出异常,代理将原始消息发送到dlq或
repubishtodlq=true
,这意味着绑定器将消息发布到dlq,附加诊断信息(标题中的异常等)。自动绑定dlq只需设置dlq并将原始队列配置为在那里发送拒绝(用于引发异常时)。没有DLQ配置,队列不能已经存在;您无法在创建队列后更改它。这就是问题所在:“队列必须在没有DLQ配置的情况下不存在;您无法在创建队列后更改它”。谢谢
Trying...
Trying...
Trying...
(end of log, no exception thrown)