问题描述
我有一个要求,其中我有 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());
}
}
解决方法
没有;不支持;您需要为这些更复杂的场景编写自定义代码。