spring-每个异常的云流重试策略
spring-cloud-stream retry policy per exception
在 spring-cloud-stream 项目的文档中,我看到的唯一重试机制是单一退避策略。
我想要实现的行为是三种不同的重试策略,以防在使用消息时抛出异常:
- 不可恢复的异常 - 不会尝试再次处理此类消息。
- 可恢复异常 - 这种消息在被丢弃之前会被重试多次。
- 暂时性异常 - 此类消息将永远重试。
有没有办法为每种异常定义不同的重试策略?
我知道在 spring-kafka 中可以提供 RetryTemplate 并实现上述行为。
我认为也许可以通过 DLQ 机制实现这种行为。
编辑:我使用 Kafka 作为消息中间件。
目前无法将重试配置到那种程度;有 an open new feature request.
但是,您始终可以在监听器中实现自己的逻辑,使用 RetryTemplate
并禁用活页夹的重试。
如果您正在使用 Rabbit 活页夹,您可以使用 DLQ 和 republishToDlq=true
,并且 DLQ 消息将包含异常 headers。然后,您可以让另一个应用使用这些消息并根据异常类型采取适当的操作。
从 Spring Cloud Stream 2.0.0 开始,您可以定义自己的 RetryTemplate
:
@StreamRetryTemplate
public RetryTemplate myRetryTemplate() {
return new RetryTemplate();
}
完整文档在这里:https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/#_retry_template
鉴于:
UnrecoverableException = 您想要转到 DLQ 或立即丢弃而不重试的异常。
TransientException = 您希望重试直到成功的异常
我的配置中的类似内容 class 使它起作用:
@StreamRetryTemplate
public RetryTemplate myRetryTemplate() {
RetryTemplate myRetry = RetryTemplate.builder()
.notRetryOn(UnrecoverableException.class)
//make sure that the exception type is the cause
//even if it's wrapped
.traversingCauses()
.retryOn(TransientException.class)
.traversingCauses()
//custom backoff policy
.exponentialBackoff(2000, 2, 20000, true)
.build();
return myRetry;
}
在 spring-cloud-stream 项目的文档中,我看到的唯一重试机制是单一退避策略。
我想要实现的行为是三种不同的重试策略,以防在使用消息时抛出异常:
- 不可恢复的异常 - 不会尝试再次处理此类消息。
- 可恢复异常 - 这种消息在被丢弃之前会被重试多次。
- 暂时性异常 - 此类消息将永远重试。
有没有办法为每种异常定义不同的重试策略? 我知道在 spring-kafka 中可以提供 RetryTemplate 并实现上述行为。
我认为也许可以通过 DLQ 机制实现这种行为。
编辑:我使用 Kafka 作为消息中间件。
目前无法将重试配置到那种程度;有 an open new feature request.
但是,您始终可以在监听器中实现自己的逻辑,使用 RetryTemplate
并禁用活页夹的重试。
如果您正在使用 Rabbit 活页夹,您可以使用 DLQ 和 republishToDlq=true
,并且 DLQ 消息将包含异常 headers。然后,您可以让另一个应用使用这些消息并根据异常类型采取适当的操作。
从 Spring Cloud Stream 2.0.0 开始,您可以定义自己的 RetryTemplate
:
@StreamRetryTemplate
public RetryTemplate myRetryTemplate() {
return new RetryTemplate();
}
完整文档在这里:https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/#_retry_template
鉴于: UnrecoverableException = 您想要转到 DLQ 或立即丢弃而不重试的异常。 TransientException = 您希望重试直到成功的异常
我的配置中的类似内容 class 使它起作用:
@StreamRetryTemplate
public RetryTemplate myRetryTemplate() {
RetryTemplate myRetry = RetryTemplate.builder()
.notRetryOn(UnrecoverableException.class)
//make sure that the exception type is the cause
//even if it's wrapped
.traversingCauses()
.retryOn(TransientException.class)
.traversingCauses()
//custom backoff policy
.exponentialBackoff(2000, 2, 20000, true)
.build();
return myRetry;
}