netflix.ocelli.rxnetty.HttpClientConfigurator Maven / Gradle / Ivy
package netflix.ocelli.rxnetty;
import io.netty.buffer.ByteBuf;
import io.reactivex.netty.RxNetty;
import io.reactivex.netty.protocol.http.client.HttpClientRequest;
import io.reactivex.netty.protocol.http.client.HttpClientResponse;
import java.util.concurrent.TimeUnit;
import netflix.ocelli.Host;
import netflix.ocelli.Instance;
import netflix.ocelli.executor.ExecutorBuilder;
import netflix.ocelli.executor.ExecutorBuilder.Configurator;
import netflix.ocelli.functions.Delays;
import netflix.ocelli.functions.Metrics;
import netflix.ocelli.util.SingleMetric;
import rx.Observable;
import rx.functions.Func0;
import rx.functions.Func1;
import rx.functions.Func2;
public class HttpClientConfigurator implements Configurator, HttpClientRequest, HttpClientResponse> {
private final Observable> hosts;
public HttpClientConfigurator(Observable> hosts) {
this.hosts = hosts;
}
@Override
public void configure(ExecutorBuilder, HttpClientRequest, HttpClientResponse> builder) {
final Func0> metricFactory = new Func0>() {
@Override
public SingleMetric call() {
return Metrics.memoize(10L);
}
};
builder
.withInstances(hosts)
.withClientFactory(
new Func1>() {
@Override
public HttpClientHolder call(Host host) {
return new HttpClientHolder(
RxNetty.createHttpClient(host.getHostName(), host.getPort()),
metricFactory.call());
}
})
.withQuarantineStrategy(Delays.fixed(1, TimeUnit.SECONDS))
.withFailureDetector(HttpClientHolder.failureDetector())
.withClientShutdown(HttpClientHolder.shutdown())
.withRequestOperation(new Func2, HttpClientRequest, Observable>>() {
@Override
public Observable> call(
HttpClientHolder holder,
HttpClientRequest request) {
return holder.getClient().submit(request);
}
});
}
}