提交 be03eb04 编写于 作者: A Allen Wang

Fix the problem that max response timeout is not set correctly with Hystrix....

Fix the problem that max response timeout is not set correctly with Hystrix. Make RequestTemplate an abstract class to facilitate future additions.
上级 6f68b70f
......@@ -9,17 +9,41 @@ import com.netflix.ribbonclientextensions.hystrix.FallbackHandler;
* @param <T> response entity type
* @param <R> response meta data, e.g. HttpClientResponse
*/
public interface RequestTemplate<T, R> {
public abstract class RequestTemplate<T, R> {
RequestBuilder<T> requestBuilder();
private final String name;
private final ResourceGroup<?> group;
private final Class<? extends T> classType;
public RequestTemplate(String name,
ResourceGroup<?> group,
Class<? extends T> classType) {
super();
this.name = name;
this.group = group;
this.classType = classType;
}
String name();
public final String name() {
return name;
}
public final ResourceGroup<?> group() {
return group;
}
public final Class<? extends T> classType() {
return classType;
}
public abstract RequestBuilder<T> requestBuilder();
RequestTemplate<T, R> copy(String name);
public abstract RequestTemplate<T, R> copy(String name);
RequestTemplate<T, R> withFallbackProvider(FallbackHandler<T> fallbackProvider);
public abstract RequestTemplate<T, R> withFallbackProvider(FallbackHandler<T> fallbackHandler);
RequestTemplate<T, R> withResponseValidator(ResponseValidator<R> transformer);
public abstract RequestTemplate<T, R> withResponseValidator(ResponseValidator<R> validator);
/**
* Calling this method will enable both Hystrix request cache and supplied external cache providers
......@@ -29,13 +53,13 @@ public interface RequestTemplate<T, R> {
* @param cacheKeyTemplate
* @return
*/
RequestTemplate<T, R> withRequestCacheKey(String cacheKeyTemplate);
public abstract RequestTemplate<T, R> withRequestCacheKey(String cacheKeyTemplate);
RequestTemplate<T, R> addCacheProvider(String cacheKeyTemplate, CacheProvider<T> cacheProvider);
public abstract RequestTemplate<T, R> addCacheProvider(String cacheKeyTemplate, CacheProvider<T> cacheProvider);
RequestTemplate<T, R> withHystrixProperties(HystrixObservableCommand.Setter setter);
public abstract RequestTemplate<T, R> withHystrixProperties(HystrixObservableCommand.Setter setter);
public abstract class RequestBuilder<T> {
public static abstract class RequestBuilder<T> {
public abstract RequestBuilder<T> withRequestProperty(String key, Object value);
public abstract RibbonRequest<T> build();
......
......@@ -74,7 +74,7 @@ class HttpRequest<T> implements RibbonRequest<T> {
RibbonHystrixObservableCommand<T> createHystrixCommand() {
return new RibbonHystrixObservableCommand<T>(client, httpRequest, hystrixCacheKey, cacheProviders, requestProperties, template.fallbackHandler(),
template.responseValidator(), template.getClassType(), template.hystrixProperties());
template.responseValidator(), template.classType(), template.hystrixProperties());
}
@Override
......
......@@ -24,7 +24,7 @@ import com.netflix.ribbonclientextensions.ResponseValidator;
import com.netflix.ribbonclientextensions.hystrix.FallbackHandler;
import com.netflix.ribbonclientextensions.template.ParsedTemplate;
public class HttpRequestTemplate<T> implements RequestTemplate<T, HttpClientResponse<ByteBuf>> {
public class HttpRequestTemplate<T> extends RequestTemplate<T, HttpClientResponse<ByteBuf>> {
private final HttpClient<ByteBuf, ByteBuf> client;
private final String clientName;
......@@ -34,14 +34,11 @@ public class HttpRequestTemplate<T> implements RequestTemplate<T, HttpClientResp
private ParsedTemplate parsedUriTemplate;
private ResponseValidator<HttpClientResponse<ByteBuf>> validator;
private HttpMethod method;
private final String name;
private final List<CacheProviderWithKeyTemplate<T>> cacheProviders;
private ParsedTemplate hystrixCacheKeyTemplate;
private Map<String, ParsedTemplate> parsedTemplates;
private final Class<? extends T> classType;
private final int concurrentRequestLimit;
private final HttpHeaders headers;
private final HttpResourceGroup group;
static class CacheProviderWithKeyTemplate<T> {
private ParsedTemplate keyTemplate;
......@@ -61,8 +58,8 @@ public class HttpRequestTemplate<T> implements RequestTemplate<T, HttpClientResp
}
public HttpRequestTemplate(String name, HttpResourceGroup group, Class<? extends T> classType) {
super(name, group, classType);
this.client = group.getClient();
this.classType = classType;
if (client instanceof LoadBalancingRxClient) {
LoadBalancingRxClient<?, ? ,?> ribbonClient = (LoadBalancingRxClient<?, ? ,?>) client;
maxResponseTime = ribbonClient.getResponseTimeOut();
......@@ -73,8 +70,6 @@ public class HttpRequestTemplate<T> implements RequestTemplate<T, HttpClientResp
maxResponseTime = -1;
concurrentRequestLimit = -1;
}
this.name = name;
this.group = group;
method = HttpMethod.GET;
headers = new DefaultHttpHeaders();
headers.add(group.getHeaders());
......@@ -93,14 +88,14 @@ public class HttpRequestTemplate<T> implements RequestTemplate<T, HttpClientResp
if (setter == null) {
setter = HystrixObservableCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(clientName))
.andCommandKey(HystrixCommandKey.Factory.asKey(name()));
HystrixCommandProperties.Setter commandProps = HystrixCommandProperties.Setter();
if (maxResponseTime > 0) {
setter.andCommandPropertiesDefaults(
HystrixCommandProperties.Setter().withExecutionIsolationThreadTimeoutInMilliseconds(maxResponseTime));
commandProps.withExecutionIsolationThreadTimeoutInMilliseconds(maxResponseTime);
}
if (concurrentRequestLimit > 0) {
setter.andCommandPropertiesDefaults(
HystrixCommandProperties.Setter().withExecutionIsolationSemaphoreMaxConcurrentRequests(concurrentRequestLimit));
commandProps.withExecutionIsolationSemaphoreMaxConcurrentRequests(concurrentRequestLimit);
}
setter.andCommandPropertiesDefaults(commandProps);
}
return new HttpRequestBuilder<T>(this);
}
......@@ -167,20 +162,11 @@ public class HttpRequestTemplate<T> implements RequestTemplate<T, HttpClientResp
HttpMethod method() {
return method;
}
Class<? extends T> getClassType() {
return this.classType;
}
HttpHeaders getHeaders() {
return this.headers;
}
@Override
public String name() {
return name;
}
@Override
public HttpRequestTemplate<T> withResponseValidator(
ResponseValidator<HttpClientResponse<ByteBuf>> validator) {
......@@ -190,7 +176,7 @@ public class HttpRequestTemplate<T> implements RequestTemplate<T, HttpClientResp
@Override
public HttpRequestTemplate<T> copy(String name) {
HttpRequestTemplate<T> newTemplate = new HttpRequestTemplate<T>(name, this.group, this.classType);
HttpRequestTemplate<T> newTemplate = new HttpRequestTemplate<T>(name, (HttpResourceGroup) this.group(), this.classType());
newTemplate.cacheProviders.addAll(this.cacheProviders);
newTemplate.method = this.method;
newTemplate.headers.add(this.headers);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册