自定义弹簧重试模板的重试计数始终为0

时间:2019-02-14 14:03:57

标签: java spring-boot kotlin

我正在尝试为服务实现不确定的指数补偿。重试策略等均能按预期工作,但是我们需要重试计数有一定的可见性,我希望将此信息记录在execute块本身中(我已经设置了一个侦听器,该侦听器可以检索重试计数并将其正确记录,但它不包含我们的跨度/跟踪ID,也无权访问我们未能写入等的URI。

代码如下:

自定义重试模板:

@StreamRetryTemplate
fun streamRetryTemplate(): RetryTemplate {
    val backOffPolicy = ExponentialRandomBackOffPolicy().apply {
        initialInterval = config.initialInterval
        multiplier = config.multiplier
        maxInterval = config.maxInterval
    }
    return RetryTemplate().apply {
        setRetryPolicy(AlwaysRetryPolicy())
        setBackOffPolicy(backOffPolicy)
        setListeners(retryListeners())
    }
}

...这是确实正确记录重试计数的侦听器:

@Bean
fun retryListeners(): Array<RetryListener> {

    return arrayOf(object : RetryListenerSupport() {

        override fun <T, E : Throwable> onError(
            context: RetryContext?, callback: RetryCallback<T, E>?, throwable: Throwable?
        ) {
            logger.info { "FROM LISTENER: ${context?.retryCount}" }
        }
    })
}

...这是实际上正在执行重试逻辑的函数,但是 NOT 的重试计数永远不会大于0,尽管侦听器已意识到重试计数大于0并正确记录:

private fun attachRequestWithRetries(method: HttpMethod, uri: String, record: Record) =
    streamRetryTemplate.execute(RetryCallback<Mono<ClientResponse>, Exception> { context ->
        if (context.retryCount > 0) logger.warn { "Retrying $method $uri. Retry: ${context.retryCount}" }
        attachRequest(method, uri, record)
    })

有什么想法为什么不能正确增加?

0 个答案:

没有答案