spring-每个异常的云流重试策略

spring-cloud-stream retry policy per exception

在 spring-cloud-stream 项目的文档中,我看到的唯一重试机制是单一退避策略。
我想要实现的行为是三种不同的重试策略,以防在使用消息时抛出异常:

  1. 不可恢复的异常 - 不会尝试再次处理此类消息。
  2. 可恢复异常 - 这种消息在被丢弃之前会被重试多次。
  3. 暂时性异常 - 此类消息将永远重试。

有没有办法为每种异常定义不同的重试策略? 我知道在 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;
}