2016-07-23 40 views
5

Rozważmy następujące inicjacji z OkHttp i modernizowanych:Okhttp ignoruje Dispatcher ustawienie w przypadku korzystania z modernizowanych RxJavaCallAdapterFactory

public static SomeServiceRestInterface newRestService(String apiUrl) { 
      Retrofit retrofit = new Retrofit.Builder() 
        .baseUrl(apiUrl) 
        .client(createOkHttpClient()) 
        .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io())) 
        .addConverterFactory(createGsonConverter()) 
        .build(); 
      return retrofit.create(SomeServiceRestInterface.class); 
} 

private static OkHttpClient createOkHttpClient() { 
        Dispatcher dispatcher = new Dispatcher(); 
        dispatcher.setMaxRequestsPerHost(1); 
        dispatcher.setMaxRequests(1); 
        OkHttpClient.Builder builder = new OkHttpClient.Builder() 
           .dispatcher(dispatcher).build() 
} 

Testując reszta połączeń, zauważyłem, że Okhttp nie honoruje ustawienia setMaxRequestsPerHost lub setMaxRequests na wszystko. Oto dziennik z 3 żądaniami wysłanymi jednocześnie:

23/07 04:14:22.668 [RxIoScheduler-4] DEBUG - --> POST https://XXX/1 http/1.1 
23/07 04:14:22.668 [RxIoScheduler-4] DEBUG - Content-Length: 0 
23/07 04:14:22.668 [RxIoScheduler-4] DEBUG - --> END POST (0-byte body) 
23/07 04:14:22.672 [RxIoScheduler-7] DEBUG - --> POST https://XXX/2 http/1.1 
23/07 04:14:22.673 [RxIoScheduler-7] DEBUG - Content-Length: 0 
23/07 04:14:22.673 [RxIoScheduler-7] DEBUG - --> END POST (0-byte body) 
23/07 04:14:22.676 [RxIoScheduler-6] DEBUG - --> POST https://XXX/3 http/1.1 
23/07 04:14:22.677 [RxIoScheduler-6] DEBUG - Content-Length: 0 
23/07 04:14:22.677 [RxIoScheduler-6] DEBUG - --> END POST (0-byte body) 

gdzie XXX to ta sama domena, 1/2/3 to różne ścieżki.

Nie jestem pewien dlaczego, ale myślałem, że to może mieć związek z zestawem RxJava Scheduler w addCallAdapterFactory.

Czy to błąd? czy coś mi brakuje?

Używam okhttp 3.4.1, i modernizuję 2.1.0.

+0

Czy sprawdziłeś liczbę utworzonych klientów? –

Odpowiedz

4

Cytując Jake Wharton w tej kwestii:

Realizacja obserwowalne dla Retrofit wykonuje żądania synchronicznie zależnych od zastosowanego harmonogram dla każdej niekoniecznie ograniczającego. Jeśli potrzebujesz ograniczeń od Okapturzającego OkHttp do bycia uznanym , będziesz musiał napisać niestandardowy CallAdapter dla Obserwowalnego , który używa Call.enqueue zamiast Call.execute.

Obecnie mamy żadnych planów, aby wesprzeć ten, choć jest prawdopodobne, że Modernizacja v3 zbudowany na hipotetycznej OkHttp v4 może zrobić to domyślny (choć jest to daleko).

Jest to to samo zachowanie, które można zaobserwować, jeśli użyjesz funkcji Retrofit Call i wywołasz funkcję .execute(), a nawet użyjesz wywołania OkHttp z jego .execute().