Hi,
I am triggering two http requests in parallel using
FutureRequestExecutionService.
I am trying to read response body in Callback completed:
EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8)
However, I am getting exception: java.io.IOException: Attempted read on
closed stream
I am using Apache HTTP Client 4.5.2 in a Adobe AEM (Sling Framework)
project. (Java based)
I am calling getEntity() only once in code and I am not debugging it (so
no watch by IDE or whatever).
If I execute both http requests "standard" sequentially everything is
working as expected.
Any help would be greatly appreciated since I ve run out of options what
else to try.
--
Volker
Relevant parts of the code:
ExecutorService executor = Executors.newFixedThreadPool(2);
HttpClientBuilder clientBuilder =
HttpRequestUtility.createDefaultHttpClientBuilder().setMaxConnPerRoute(2);
CloseableHttpClient httpClient = clientBuilder.build();
FutureRequestExecutionService requestExecService = new
FutureRequestExecutionService(httpClient, executor);
CountDownLatch latch = new CountDownLatch(2); // Wait for 3 responses
Map<String, HttpResponseInfo> responseMap = new HashMap<>();
requestExecService.execute(reqSalesforceAccountContacts.getHttpGet(),
HttpClientContext.create(), new
SalesforceRestAPIContactPoc.DefaultResponseHandler(), new
SalesforceRestAPIContactPoc.MyCallback(reqSalesforceAccountContacts.getResponseInfo(),
latch, responseMap));
requestExecService.execute(reqOpenCases.getHttpGet(),
HttpClientContext.create(), new
SalesforceRestAPIContactPoc.DefaultResponseHandler(), new
SalesforceRestAPIContactPoc.MyCallback(reqOpenCases.getResponseInfo(),
latch, responseMap));
latch.await(); // Wait for all responses
Callback Class:
private final class MyCallback implements FutureCallback<HttpResponse> {
private final HttpResponseInfo responseInfo;
private final CountDownLatch latch;
private final Map<String, HttpResponseInfo> responseMap;
public MyCallback(HttpResponseInfo responseInfo, CountDownLatch
latch, Map<String, HttpResponseInfo> responseMap) {
this.responseInfo = responseInfo;
this.latch = latch;
this.responseMap = responseMap;
}
@Override
public void completed(HttpResponse response) {
logger.error("Callback completed: {}",
responseInfo.getRequestId());
responseInfo.setStatusCode(response.getStatusLine().getStatusCode())
.setHeaders(response.getAllHeaders());
try {
responseInfo.setBody(EntityUtils.toString(response.getEntity(),
StandardCharsets.UTF_8));
} catch (ParseException|IOException e) {
// Exception triggered here
logger.error("Failed to get Body Contacts", e);
}
if (responseInfo.isOk()) {
responseInfo.logRequestFinished();
} else {
responseInfo.logAsError();
}
responseMap.put(responseInfo.getRequestId(), responseInfo);
latch.countDown(); // Signal completion
}
---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org
For additional commands, e-mail: httpclient-users-h...@hc.apache.org