2016-07-23 6 views
5

OkHttp के निम्नलिखित initializations और रेट्रोफिट पर विचार करें:Okhttp डिस्पैचर सेटिंग पर ध्यान नहीं देता जब रेट्रोफिट 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() 
} 

जब परीक्षण बाकी कहता है, मैंने देखा है कि Okhttp पर setMaxRequestsPerHost या setMaxRequests सेटिंग्स का सम्मान नहीं करता है सब।

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) 

जहां XXX ही डोमेन है, 1/2/3 अलग रास्ते हैं: यहाँ एक साथ भेजा 3 अनुरोधों का लॉग है।

मुझे यकीन नहीं है कि क्यों मैंने सोचा कि संभवत: यह addCallAdapterFactory में RxJava शेड्यूलर सेट के साथ करना है।

क्या यह एक बग है? या क्या मैं कुछ न कुछ भूल रहा हूं?

मैं okhttp 3.4.1 का उपयोग कर रहा हूं, और 2.1.0 को पुन: स्थापित कर रहा हूं।

+0

क्या आपने जांच की है कि आपने कितने http क्लाइंट बनाए हैं? –

उत्तर

4

इस मुद्दे पर जेक व्हार्टन के शब्दों में:

रेट्रोफिट के लिए प्रत्यक्ष के कार्यान्वयन कार्यान्वित अनुरोध तुल्यकालिक किसी भी जरूरी सीमित के लिए लागू समयबद्धक पर भरोसा। यदि आपको ओकेएचटीपी के डिस्पैचर से सम्मानित करने की सीमा की आवश्यकता है, तो आपको ऑब्जर्जेबल के लिए एक कस्टम कॉलएडाप्टर लिखना होगा जो Call.execute के बजाय Call.enqueue का उपयोग करता है।

हम वर्तमान में, इस का समर्थन करने के कोई योजना नहीं है, हालांकि यह संभावना है कि रेट्रोफिट एक काल्पनिक OkHttp v4 पर बनाया गया v3 इस डिफ़ॉल्ट बना सकता है (हालांकि यह एक लंबा रास्ता बंद है) है।

यह वही व्यवहार है जो आप देखेंगे कि आपने रेट्रोफिट के कॉल का उपयोग किया था और .execute(), या यहां तक ​​कि ओकेएचटीपी के कॉल को .execute() के साथ भी इस्तेमाल किया था।

संबंधित मुद्दे