Retrofit2 параллельных запросов - PullRequest
0 голосов
/ 15 октября 2019

Я использую OkHttp + Retrofit2 для создания API для сторонней системы.
Я заметил, что даже при использовании ConnectionPool и нескольких потоков Retrofit никогда не совершает одновременных вызовов.

Вот как я создаю сервис:

OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder();
httpClientBuilder.connectionPool(new ConnectionPool(7, 1, TimeUnit.MINUTES););
Dispatcher dispatcher = new Dispatcher();
dispatcher.setMaxRequests(10);
dispatcher.setMaxRequestsPerHost(10);
httpClientBuilder.dispatcher(dispatcher);
OkHttpClient okhttp = httpClientBuilder.build();
this.service = new Retrofit.Builder().baseUrl(API_URL).addConverterFactory(GsonConverterFactory.create(getGson())).client(okhttp).build().create(IService.class);

Чтобы упростить IService.class, давайте предложим, что у него есть только 2 метода:

@GET
    Call<JsonElement> get(@Url String url, @HeaderMap Map<String, Object> headers, @QueryMap Map<String, Object> query);

        @POST
    Call<ResponseBody> complexPost(@Url String url, @HeaderMap Map<String, Object> headers, @QueryMap Map<String, Object> query, @Body RequestBody body);

теперь этоВот как я пытаюсь сделать параллельные запросы:

public static void main(String[] args) {

    final Map<String,Object> empty = new HashMap<String, Object>();
        new Thread(new Runnable() {

            @Override
            public void run() {
                    while(true) {
                        System.out.println("sending short request");
                        this.service.get(bar,empty,empty).execute();
                        System.out.println("short request sent");
                    }
            }
        }).start();


        new Thread(new Runnable() {

            @Override
            public void run() {
                byte[] buffer  = new byte[1024*1024];

                    while(true) {
                        RequestBody requestFile = RequestBody.create(MediaType.parse("application/octet-stream"), buffer, 0, buffer.length);
                        System.out.println("sending long request");
                        this.service.complexPost(foo, empty, empty, requestFile).execute();
                        System.out.println("long request sent");
                    }
            }
        }).start();

}

Простое объяснение: два потока, поток A отправляет небольшой запрос GET - поток B отправляет запрос данных 1 МБ [всего 1024 * 1024 нуля]

Итак, ничего не синхронизировано, у меня есть пул соединений с достаточным количеством незанятых соединений, чтобы он работал параллельно, В МОЕМ УМЕ, так как синусоидальный запрос B больше, естественно, это занимает много времени, чтобы завершить запрос, но поскольку синхронизация отсутствуетдолжно быть много "короткого запроса отправлено" для каждого "длинного запроса отправлено".

но печатается что-то вроде:

sending short request
short request sent  
sending long request
long request sent
sending short request
short request sent
sending long request
long request sent
sending short request
short request sent

никакой поток не прерывает другой запрос. ПОЧЕМУ???? как сделать несколько запросов параллельно?

...