当特定方法失败而不是重试该失败方法时,是否有任何方法可以重试不同的方法

问题描述

我有一个要求,其中我有 2 个方法(在不同的类中),其中一个方法使 Rest GET 调用以获取令牌(类似于会话令牌,有效期为几秒钟)和另一种方法附加此检索到的令牌在标头中并进行 Rest POST 调用,因此每当 POST 调用因令牌过期而失败时,我需要重试 GET 调用方法(而不是单独重试 POST 调用)以获取新令牌并在 POST 请求标头中使用令牌并重试 post 调用(使用新令牌)。我只能看到可重试的重试方法失败,在我的情况下,它会单独重试 POST 调用,因此最终会使用过期的令牌重试 post 调用方法。当过期令牌的 post 方法失败时,我想重试 Get 方法和 POST 方法。所以我想知道当特定方法失败时有什么方法可以重试不同的方法。感谢您的帮助。

可重试类(getCSRFToken-get call,sapPost-post call)

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;

@Component
public class RestTemplateRetry extends AbstractRestTemplate{

    @Retryable(value= {Exception.class},maxAttempts=5,backoff = @Backoff(delay = 2000))
    public ResponseEntity<String> getCSRFToken (HttpEntity<String> entity,String getUrl) throws Exception{
        ResponseEntity<String> csrfToken= getRestTempalte().exchange(getUrl,HttpMethod.GET,entity,String.class);
        return csrfToken;
    }

    @Retryable(value= {Exception.class},backoff = @Backoff(delay = 2000))
    public ResponseEntity<String> sapPost (HttpEntity<String> entity,String postUrl)throws  Exception{
        ResponseEntity<String> response= getRestTempalte().exchange(postUrl,HttpMethod.POST,String.class);
        return response;
    }
}

监听类

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.retry.RetryCallback;
import org.springframework.retry.RetryContext;
import org.springframework.retry.listener.RetryListenerSupport;
import org.springframework.stereotype.Component;

@Component
public class RetryListener extends RetryListenerSupport {
    Logger log = LoggerFactory.getLogger(getClass());

    
    @Override
    public <T,E extends Throwable> void onError(
            RetryContext context,RetryCallback<T,E> callback,Throwable throwable) {
        log.warn("Retryable method {} threw {}th,attempted retries = {} with exception {}",context.getAttribute("context.name"),context.getRetryCount(),context.getRetryCount() - 1,throwable.toString());

    }

}


解决方法

没有;不支持;您需要为这些更复杂的场景编写自定义代码。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...