Skip to content

Instantly share code, notes, and snippets.

@xialeistudio
Created April 29, 2023 01:19
Show Gist options
  • Save xialeistudio/4eb19393a3eec0779167174ee24c610a to your computer and use it in GitHub Desktop.
Save xialeistudio/4eb19393a3eec0779167174ee24c610a to your computer and use it in GitHub Desktop.
Feign retry example
  1. Use ErrorDecoder to wrapper the exception we need to retry.
  2. Implement a retryer to retry, we can setting requestTemplate to replace some paramaters.
package com.example.feign;
import feign.Feign;
import feign.Headers;
import feign.Logger.JavaLogger;
import feign.Logger.Level;
import feign.Param;
import feign.Request.Options;
import feign.RequestLine;
import feign.Response;
import feign.RetryableException;
import feign.Retryer;
import feign.codec.ErrorDecoder;
import feign.gson.GsonDecoder;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) {
var github = Feign.builder()
.decoder(new GsonDecoder())
.options(new Options(5, TimeUnit.SECONDS, 10, TimeUnit.SECONDS, true))
.logger(new JavaLogger("Github.Logger").appendToFile("github.log"))
.retryer(new MyRetryer())
.logLevel(Level.FULL)
.errorDecoder(new ErrorDecoder() {
private final ErrorDecoder defaultErrorDecoder = new Default();
@Override
public Exception decode(String methodKey, Response response) {
// wrapper 401 and 403 to RetryableException in order to retry
if (response.status() == 401 || response.status() == 403) {
return new RetryableException(response.status(), response.reason(), response.request().httpMethod(), null, response.request());
}
return defaultErrorDecoder.decode(methodKey, response);
}
})
.target(Github.class, "https://api.github.com");
var contributors = github.contributors("xialeistudio", "xialeistudio.github.io", "xx");
for (var contributor : contributors) {
System.out.println(contributor.login + " " + contributor.contributions);
}
}
static class MyRetryer implements Retryer {
private int attempt = 1;
@Override
public void continueOrPropagate(RetryableException e) {
if (++attempt > 3) {
throw e;
}
e.request().requestTemplate().removeHeader("Authorization");
e.request().requestTemplate().header("Authorization", "Bearer xx");
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
throw e;
}
}
@Override
public Retryer clone() {
return new MyRetryer();
}
}
interface Github {
@RequestLine("GET /repos/{owner}/{repo}/contributors")
@Headers("Authorization: Bearer {token}")
List<Contributor> contributors(@Param("owner") String owner, @Param("repo") String repo, @Param("token") String token);
}
static class Contributor {
String login;
int contributions;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment