我正在尝试为服务实现不确定的指数补偿。重试策略等均能按预期工作,但是我们需要重试计数有一定的可见性,我希望将此信息记录在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)
})
有什么想法为什么不能正确增加?