- Use
ErrorDecoder
to wrapper the exception we need to retry. - Implement a retryer to retry, we can setting
requestTemplate
to replace some paramaters.
Created
April 29, 2023 01:19
-
-
Save xialeistudio/4eb19393a3eec0779167174ee24c610a to your computer and use it in GitHub Desktop.
Feign retry example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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