HttpRequest.java 4.0 KB
Newer Older
1 2
package com.netflix.ribbonclientextensions.http;

3 4 5 6 7 8 9 10 11
import io.netty.buffer.ByteBuf;
import io.reactivex.netty.protocol.http.client.HttpClient;
import io.reactivex.netty.protocol.http.client.HttpClientRequest;
import io.reactivex.netty.protocol.http.client.HttpClientResponse;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
12 13 14
import java.util.concurrent.Future;

import rx.Observable;
15 16
import rx.Observable.OnSubscribe;
import rx.Subscriber;
17

18
import com.netflix.hystrix.HystrixExecutableInfo;
19 20 21
import com.netflix.hystrix.HystrixObservableCommand;
import com.netflix.ribbonclientextensions.CacheProvider;
import com.netflix.ribbonclientextensions.ResponseValidator;
22
import com.netflix.ribbonclientextensions.RibbonRequest;
23
import com.netflix.ribbonclientextensions.RequestWithMetaData;
24
import com.netflix.ribbonclientextensions.RibbonResponse;
25 26 27 28
import com.netflix.ribbonclientextensions.http.HttpRequestTemplate.CacheProviderWithKeyTemplate;
import com.netflix.ribbonclientextensions.hystrix.FallbackHandler;
import com.netflix.ribbonclientextensions.template.TemplateParser;
import com.netflix.ribbonclientextensions.template.TemplateParsingException;
29

A
Allen Wang 已提交
30
class HttpRequest<T> implements RibbonRequest<T> {
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
    
    static class CacheProviderWithKey<T> {
        CacheProvider<T> cacheProvider;
        String key;
        public CacheProviderWithKey(CacheProvider<T> cacheProvider, String key) {
            super();
            this.cacheProvider = cacheProvider;
            this.key = key;
        }
        public final CacheProvider<T> getCacheProvider() {
            return cacheProvider;
        }
        public final String getKey() {
            return key;
        }
    }
    
    private final HttpClientRequest<ByteBuf> httpRequest;
    private final String hystrixCacheKey;
    private final List<CacheProviderWithKey<T>> cacheProviders;
    private final Map<String, Object> requestProperties;
    private final HttpClient<ByteBuf, ByteBuf> client;
    private final HttpRequestTemplate<T> template;
54

55 56 57 58 59 60 61 62 63
    HttpRequest(HttpRequestBuilder<T> requestBuilder) throws TemplateParsingException {
        this.client = requestBuilder.template().getClient();
        this.httpRequest = requestBuilder.createClientRequest();
        this.hystrixCacheKey = requestBuilder.hystrixCacheKey();
        this.requestProperties = new HashMap<String, Object>(requestBuilder.requestProperties());
        this.cacheProviders = new LinkedList<CacheProviderWithKey<T>>();
        this.template = requestBuilder.template();
        addCacheProviders(requestBuilder.cacheProviders());
    }
64

65 66 67 68 69 70 71 72 73 74 75 76 77
    private void addCacheProviders(List<CacheProviderWithKeyTemplate<T>> providers) throws TemplateParsingException {
        if (providers != null && providers.size() > 0) {
            for (CacheProviderWithKeyTemplate<T> cacheProviderWithTemplate: providers) {
                CacheProvider<T> provider = cacheProviderWithTemplate.getProvider();
                String key = TemplateParser.toData(this.requestProperties, cacheProviderWithTemplate.getKeyTemplate());
                cacheProviders.add(new CacheProviderWithKey<T>(provider, key));
            }
        }
    }
    
    RibbonHystrixObservableCommand<T> createHystrixCommand() {
        return new RibbonHystrixObservableCommand<T>(client, httpRequest, hystrixCacheKey, cacheProviders, requestProperties, template.fallbackHandler(), 
                template.responseValidator(), template.getClassType(), template.hystrixProperties());
78 79 80
    }
    
    @Override
A
Allen Wang 已提交
81
    public T execute() {
82
        return createHystrixCommand().execute();
83 84 85
    }

    @Override
A
Allen Wang 已提交
86
    public Future<T> queue() {
87
        return createHystrixCommand().queue();
88 89 90
    }

    @Override
A
Allen Wang 已提交
91
    public Observable<T> observe() {
92
        return createHystrixCommand().observe();
93 94 95
    }

    @Override
A
Allen Wang 已提交
96
    public Observable<T> toObservable() {
97
        return createHystrixCommand().toObservable();
98
    }
99

100
    @Override
A
Allen Wang 已提交
101
    public RequestWithMetaData<T> withMetadata() {
102
        return new HttpMetaRequest<T>(this);
103
    }
104
    
105 106

}