Throw IOException in RibbonLoadBalancerClient.execute
Fixes proper RestTemplate behavior. fixes gh-986
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.springframework.cloud.netflix.ribbon;
|
package org.springframework.cloud.netflix.ribbon;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -71,7 +72,7 @@ public class RibbonLoadBalancerClient implements LoadBalancerClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <T> T execute(String serviceId, LoadBalancerRequest<T> request) {
|
public <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException {
|
||||||
ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
|
ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
|
||||||
Server server = getServer(loadBalancer);
|
Server server = getServer(loadBalancer);
|
||||||
if (server == null) {
|
if (server == null) {
|
||||||
@@ -89,6 +90,11 @@ public class RibbonLoadBalancerClient implements LoadBalancerClient {
|
|||||||
statsRecorder.recordStats(returnVal);
|
statsRecorder.recordStats(returnVal);
|
||||||
return returnVal;
|
return returnVal;
|
||||||
}
|
}
|
||||||
|
// catch IOException and rethrow so RestTemplate behaves correctly
|
||||||
|
catch (IOException ex) {
|
||||||
|
statsRecorder.recordStats(ex);
|
||||||
|
throw ex;
|
||||||
|
}
|
||||||
catch (Exception ex) {
|
catch (Exception ex) {
|
||||||
statsRecorder.recordStats(ex);
|
statsRecorder.recordStats(ex);
|
||||||
ReflectionUtils.rethrowRuntimeException(ex);
|
ReflectionUtils.rethrowRuntimeException(ex);
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.springframework.cloud.netflix.ribbon;
|
package org.springframework.cloud.netflix.ribbon;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@@ -38,9 +39,12 @@ import com.netflix.loadbalancer.ServerStats;
|
|||||||
|
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.instanceOf;
|
||||||
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
import static org.mockito.BDDMockito.given;
|
import static org.mockito.BDDMockito.given;
|
||||||
import static org.mockito.Matchers.anyDouble;
|
import static org.mockito.Matchers.anyDouble;
|
||||||
@@ -139,7 +143,7 @@ public class RibbonLoadBalancerClientTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testExecute() {
|
public void testExecute() throws IOException {
|
||||||
final RibbonServer server = getRibbonServer();
|
final RibbonServer server = getRibbonServer();
|
||||||
RibbonLoadBalancerClient client = getRibbonLoadBalancerClient(server);
|
RibbonLoadBalancerClient client = getRibbonLoadBalancerClient(server);
|
||||||
final String returnVal = "myval";
|
final String returnVal = "myval";
|
||||||
@@ -176,6 +180,27 @@ public class RibbonLoadBalancerClientTests {
|
|||||||
verifyServerStats();
|
verifyServerStats();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testExecuteIOException() {
|
||||||
|
final RibbonServer ribbonServer = getRibbonServer();
|
||||||
|
RibbonLoadBalancerClient client = getRibbonLoadBalancerClient(ribbonServer);
|
||||||
|
try {
|
||||||
|
client.execute(ribbonServer.getServiceId(),
|
||||||
|
new LoadBalancerRequest<Object>() {
|
||||||
|
@Override
|
||||||
|
public Object apply(ServiceInstance instance) throws Exception {
|
||||||
|
assertServiceInstance(ribbonServer, instance);
|
||||||
|
throw new IOException();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
fail("Should have thrown exception");
|
||||||
|
}
|
||||||
|
catch (Exception ex) {
|
||||||
|
assertThat("wrong exception type", ex, is(instanceOf(IOException.class)));
|
||||||
|
}
|
||||||
|
verifyServerStats();
|
||||||
|
}
|
||||||
|
|
||||||
protected RibbonServer getRibbonServer() {
|
protected RibbonServer getRibbonServer() {
|
||||||
return new RibbonServer("testService", new Server("myhost", 9080), false,
|
return new RibbonServer("testService", new Server("myhost", 9080), false,
|
||||||
Collections.singletonMap("mykey", "myvalue"));
|
Collections.singletonMap("mykey", "myvalue"));
|
||||||
|
|||||||
Reference in New Issue
Block a user