retrofit
retrofit copied to clipboard
High CPU load with Retrofit client + RxJava2CallAdapterFactory
trafficstars

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?