Java RestTemplate,是否有方法在检查响应主体后重试成功的请求?

Java RestTemplate,是否有方法在检查响应主体后重试成功的请求?,java,spring,spring-boot,resttemplate,spring-resttemplate,Java,Spring,Spring Boot,Resttemplate,Spring Resttemplate,有没有办法重试成功的请求?所有示例都指向RestTempalte出现故障时的重试行为。我想发送一个请求,等待响应并检查响应中的一个字段,如果不是预期状态,则重试该请求。这可以使用RestTemplate完成吗? 我知道的唯一一件事是执行线程睡眠并再次调用该方法。我希望避免这种情况。尝试查看Spring Retry是否可以帮助您: 如果您指定哪些响应是可接受的,它将重试您的方法: 示例代码如下: public class RealExchangeRateCalculator implements

有没有办法重试成功的请求?所有示例都指向RestTempalte出现故障时的重试行为。我想发送一个请求,等待响应并检查响应中的一个字段,如果不是预期状态,则重试该请求。这可以使用RestTemplate完成吗?
我知道的唯一一件事是执行线程睡眠并再次调用该方法。我希望避免这种情况。

尝试查看Spring Retry是否可以帮助您:

如果您指定哪些响应是可接受的,它将重试您的方法:

示例代码如下:

public class RealExchangeRateCalculator implements ExchangeRateCalculator {

private static final double BASE_EXCHANGE_RATE = 1.09;
private int attempts = 0;
private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

@Retryable(maxAttempts=10,value=RuntimeException.class,backoff = @Backoff(delay = 10000,multiplier=2))
public Double getCurrentRate() {
    
    System.out.println("Calculating - Attempt " + attempts + " at " + sdf.format(new Date()));
    attempts++;
    
    try {
        HttpResponse<JsonNode> response = Unirest.get("http://rate-exchange.herokuapp.com/fetchRate")
            .queryString("from", "EUR")
            .queryString("to","USD")
            .asJson();
        
        switch (response.getStatus()) {
        case 200:
            return response.getBody().getObject().getDouble("Rate");
        case 503:
            throw new RuntimeException("Server Response: " + response.getStatus());
        default:
            throw new IllegalStateException("Server not ready");
        }
    } catch (UnirestException e) {
        throw new RuntimeException(e);
    }
}

@Recover
public Double recover(RuntimeException e){
    System.out.println("Recovering - returning safe value");
    return BASE_EXCHANGE_RATE;
}
公共类RealExchangeRateCalculator实现ExchangeRateCalculator{
私人静态最终双基汇率=1.09;
私有整数尝试=0;
私有SimpleDataFormat sdf=新SimpleDataFormat(“HH:mm:ss”);
@可重试(maxtures=10,value=RuntimeException.class,backoff=@backoff(延迟=10000,乘数=2))
公共双getCurrentRate(){
System.out.println(“计算-尝试”+尝试+”在“+sdf.format(new Date())”);
尝试++;
试一试{
HttpResponse response=Unirest.get(“http://rate-exchange.herokuapp.com/fetchRate")
.queryString(“来自”、“欧元”)
.queryString(“至”,“美元”)
.asJson();
开关(response.getStatus()){
案例200:
返回response.getBody().getObject().getDouble(“Rate”);
案例503:
抛出新的运行时异常(“服务器响应:+Response.getStatus());
违约:
抛出新的IllegalStateException(“服务器未就绪”);
}
}捕获(unireste异常){
抛出新的运行时异常(e);
}
}
@恢复
公共双恢复(运行时异常e){
System.out.println(“恢复-返回安全值”);
返回基准汇率;
}

尝试查看Spring Retry是否可以帮助您:

如果您指定哪些响应是可接受的,它将重试您的方法:

示例代码如下:

public class RealExchangeRateCalculator implements ExchangeRateCalculator {

private static final double BASE_EXCHANGE_RATE = 1.09;
private int attempts = 0;
private SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");

@Retryable(maxAttempts=10,value=RuntimeException.class,backoff = @Backoff(delay = 10000,multiplier=2))
public Double getCurrentRate() {
    
    System.out.println("Calculating - Attempt " + attempts + " at " + sdf.format(new Date()));
    attempts++;
    
    try {
        HttpResponse<JsonNode> response = Unirest.get("http://rate-exchange.herokuapp.com/fetchRate")
            .queryString("from", "EUR")
            .queryString("to","USD")
            .asJson();
        
        switch (response.getStatus()) {
        case 200:
            return response.getBody().getObject().getDouble("Rate");
        case 503:
            throw new RuntimeException("Server Response: " + response.getStatus());
        default:
            throw new IllegalStateException("Server not ready");
        }
    } catch (UnirestException e) {
        throw new RuntimeException(e);
    }
}

@Recover
public Double recover(RuntimeException e){
    System.out.println("Recovering - returning safe value");
    return BASE_EXCHANGE_RATE;
}
公共类RealExchangeRateCalculator实现ExchangeRateCalculator{
私人静态最终双基汇率=1.09;
私有整数尝试=0;
私有SimpleDataFormat sdf=新SimpleDataFormat(“HH:mm:ss”);
@可重试(maxtures=10,value=RuntimeException.class,backoff=@backoff(延迟=10000,乘数=2))
公共双getCurrentRate(){
System.out.println(“计算-尝试”+尝试+”在“+sdf.format(new Date())”);
尝试++;
试一试{
HttpResponse response=Unirest.get(“http://rate-exchange.herokuapp.com/fetchRate")
.queryString(“来自”、“欧元”)
.queryString(“至”,“美元”)
.asJson();
开关(response.getStatus()){
案例200:
返回response.getBody().getObject().getDouble(“Rate”);
案例503:
抛出新的运行时异常(“服务器响应:+Response.getStatus());
违约:
抛出新的IllegalStateException(“服务器未就绪”);
}
}捕获(unireste异常){
抛出新的运行时异常(e);
}
}
@恢复
公共双恢复(运行时异常e){
System.out.println(“恢复-返回安全值”);
返回基准汇率;
}

如果控制器检测到响应包含错误值,则发送失败响应如何?如果控制器检测到响应包含错误值,则发送失败响应如何?