retrofit icon indicating copy to clipboard operation
retrofit copied to clipboard

High CPU load with Retrofit client + RxJava2CallAdapterFactory

Open vhsvuong86 opened this issue 3 years ago • 0 comments
trafficstars

image

I create the retrofit client using RxJava2CallAdapterFactory (run on Scheduler with 200 threads)

final OkHttpClient client = builder
                .readTimeout(Duration.ofSeconds(30))
                .writeTimeout(Duration.ofSeconds(30))
                .callTimeout(Duration.ofSeconds(60))
                .connectionPool(new ConnectionPool(20, 2L, TimeUnit.MINUTES))
                .build();
        client.dispatcher().setMaxRequests(1000);
        client.dispatcher().setMaxRequestsPerHost(1000);
        final Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(client)
                **.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.from(taskExecutor)))**
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(200);
        executor.setMaxPoolSize(200);
        return executor;
    }
try {

            List<String> lines = Files.readAllLines(p);
            Observable.fromIterable(lines)
                    .subscribeOn(io.reactivex.schedulers.Schedulers.computation())
                    .flatMap(z -> **verifyOneReactive**(x, y, z)
                    .blockingSubscribe(obsObjectVerificationResultList::add, err -> {
                        log.error("error="+ err.getMessage());
                    });
        } catch (IOException e) {
            log.error("error=" + e.getMessage());
        }

// call the http request

function verifyOneReactive (x, y, z){
      return retrofitClient.getObsObjectInfoReactive(x, y, z)
                .map(ResponseResult::networkSuccess)
                .onErrorReturn(e -> ResponseResult.networkFail("Network Fail: " + e.getMessage()))
                .map(resResult -> {
                    if (resResult.isNetworkFail()) {
                        result.setExist(false);
                        result.setFailedReason(resResult.getNetworkFailMsg());
                        return result;
                    }
                    Response<ObjectInfoResponse> response = resResult.getResponse();
                    if (response.isSuccessful() && response.body() != null) {
                        if (response.body().getStatus().equalsIgnoreCase(STATUS_EXIST)) {
                             result.setExist(true);
                        } else {
                            result.setExist(false);
                            result.setFailedReason(response.body().getStatus());
                        }
                        return result;
                    } else {
                        String bodyText = getErrorResponseText(response);
                        result.setExist(false);
                        result.setFailedReason(bodyText);
                        return result;
                    }
                });
}

Does anyone know the root cause of why it consumes a lot of resources?

vhsvuong86 avatar Jun 17 '22 07:06 vhsvuong86