diff --git a/build.gradle b/build.gradle index 93f1afc65e..3583c47a92 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,11 @@ buildscript { } allprojects { + if (JavaVersion.current().isJava8Compatible()) { + tasks.withType(Javadoc) { + options.addStringOption('Xdoclint:none', '-quiet') // Doclint is onerous in Java 8. + } + } repositories { mavenLocal() mavenCentral() @@ -19,7 +24,9 @@ allprojects { apply from: file('gradle/convention.gradle') apply from: file('gradle/maven.gradle') -apply from: file('gradle/check.gradle') +if (!JavaVersion.current().isJava8Compatible()) { + apply from: file('gradle/check.gradle') // FindBugs is incompatible with Java 8. +} apply from: file('gradle/license.gradle') apply from: file('gradle/release.gradle') apply plugin: 'idea' @@ -113,7 +120,7 @@ project(':feign-ribbon') { dependencies { compile project(':feign-core') - compile 'com.netflix.ribbon:ribbon-core:0.3.1' + compile 'com.netflix.ribbon:ribbon-loadbalancer:2.0-RC5' testCompile 'org.testng:testng:6.8.5' testCompile 'com.google.mockwebserver:mockwebserver:20130706' } diff --git a/example-github/build.gradle b/example-github/build.gradle index bea8f74e83..5203be2b17 100644 --- a/example-github/build.gradle +++ b/example-github/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'java' dependencies { - compile 'com.netflix.feign:feign-core:6.1.1' - compile 'com.netflix.feign:feign-gson:6.1.1' + compile project(':feign-core') + compile project(':feign-gson') provided 'com.squareup.dagger:dagger-compiler:1.1.0' } diff --git a/example-wikipedia/build.gradle b/example-wikipedia/build.gradle index 3dd63f8ef0..2aa0efd9b3 100644 --- a/example-wikipedia/build.gradle +++ b/example-wikipedia/build.gradle @@ -1,8 +1,8 @@ apply plugin: 'java' dependencies { - compile 'com.netflix.feign:feign-core:6.1.1' - compile 'com.netflix.feign:feign-gson:6.1.1' + compile project(':feign-core') + compile project(':feign-gson') provided 'com.squareup.dagger:dagger-compiler:1.1.0' } diff --git a/ribbon/src/main/java/feign/ribbon/LBClient.java b/ribbon/src/main/java/feign/ribbon/LBClient.java index dcd800ad60..83fd602ed6 100644 --- a/ribbon/src/main/java/feign/ribbon/LBClient.java +++ b/ribbon/src/main/java/feign/ribbon/LBClient.java @@ -19,60 +19,61 @@ import com.netflix.client.ClientException; import com.netflix.client.ClientRequest; import com.netflix.client.IResponse; +import com.netflix.client.RequestSpecificRetryHandler; +import com.netflix.client.RetryHandler; import com.netflix.client.config.CommonClientConfigKey; import com.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.ILoadBalancer; -import com.netflix.util.Pair; - -import java.io.IOException; -import java.net.URI; -import java.util.Collection; -import java.util.Map; - import feign.Client; import feign.Request; import feign.RequestTemplate; import feign.Response; -import feign.RetryableException; -import static com.netflix.client.config.CommonClientConfigKey.ConnectTimeout; -import static com.netflix.client.config.CommonClientConfigKey.ReadTimeout; +import java.io.IOException; +import java.net.URI; +import java.util.Collection; +import java.util.Map; class LBClient extends AbstractLoadBalancerAwareClient { private final Client delegate; private final int connectTimeout; private final int readTimeout; + private final IClientConfig clientConfig; LBClient(Client delegate, ILoadBalancer lb, IClientConfig clientConfig) { + super(lb, clientConfig); + this.setRetryHandler(RetryHandler.DEFAULT); + this.clientConfig = clientConfig; this.delegate = delegate; - this.connectTimeout = Integer.valueOf(clientConfig.getProperty(ConnectTimeout).toString()); - this.readTimeout = Integer.valueOf(clientConfig.getProperty(ReadTimeout).toString()); - setLoadBalancer(lb); - initWithNiwsConfig(clientConfig); + connectTimeout = clientConfig.get(CommonClientConfigKey.ConnectTimeout); + readTimeout = clientConfig.get(CommonClientConfigKey.ReadTimeout); } @Override - public RibbonResponse execute(RibbonRequest request) throws IOException { - int connectTimeout = config(request, ConnectTimeout, this.connectTimeout); - int readTimeout = config(request, ReadTimeout, this.readTimeout); - - Request.Options options = new Request.Options(connectTimeout, readTimeout); + public RibbonResponse execute(RibbonRequest request, IClientConfig configOverride) throws IOException { + Request.Options options; + if (configOverride != null) { + options = new Request.Options(configOverride.get(CommonClientConfigKey.ConnectTimeout, connectTimeout), + (configOverride.get(CommonClientConfigKey.ReadTimeout, readTimeout))); + } else { + options = new Request.Options(connectTimeout, readTimeout); + } Response response = delegate.execute(request.toRequest(), options); return new RibbonResponse(request.getUri(), response); } - @Override protected boolean isCircuitBreakerException(Throwable e) { - return e instanceof IOException; - } - - @Override protected boolean isRetriableException(Throwable e) { - return e instanceof RetryableException; - } - @Override - protected Pair deriveSchemeAndPortFromPartialUri(RibbonRequest task) { - return new Pair(URI.create(task.request.url()).getScheme(), task.getUri().getPort()); + public RequestSpecificRetryHandler getRequestSpecificRetryHandler( + RibbonRequest request, IClientConfig requestConfig) { + if (clientConfig.get(CommonClientConfigKey.OkToRetryOnAllOperations, false)) { + return new RequestSpecificRetryHandler(true, true, this.getRetryHandler(), requestConfig); + } + if (!request.toRequest().method().equals("GET")) { + return new RequestSpecificRetryHandler(true, false, this.getRetryHandler(), requestConfig); + } else { + return new RequestSpecificRetryHandler(true, true, this.getRetryHandler(), requestConfig); + } } static class RibbonRequest extends ClientRequest implements Cloneable { @@ -134,15 +135,11 @@ Response toResponse() { @Override public void close() throws IOException { - if (response.body() != null) { - response.body().close(); - } + if (response != null && response.body() != null) { + response.body().close(); + } } - } - static int config(RibbonRequest request, CommonClientConfigKey key, int defaultValue) { - if (request.getOverrideConfig() != null && request.getOverrideConfig().containsProperty(key)) - return Integer.valueOf(request.getOverrideConfig().getProperty(key).toString()); - return defaultValue; } + }