[
https://issues.apache.org/jira/browse/HTTPCLIENT-1657?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Oleg Kalnichevski updated HTTPCLIENT-1657:
------------------------------------------
Priority: Minor (was: Major)
Fix Version/s: 4.5.1
> "Connection is not open" in httpClient.execute
> ----------------------------------------------
>
> Key: HTTPCLIENT-1657
> URL: https://issues.apache.org/jira/browse/HTTPCLIENT-1657
> Project: HttpComponents HttpClient
> Issue Type: Bug
> Affects Versions: 4.4.1
> Reporter: Neil Newman
> Priority: Minor
> Fix For: 4.5.1
>
>
> I have a program that needs to solve several problems. For each problem, it
> can try several different algorithms in parallel. As soon as one algorithm
> solves the problem, I would like the others to terminate promptly. Some
> algorithms are accessed via HTTP requests: you make a POST with the problem
> to a server, block, and the server returns an answer. If another thread finds
> the answer before the server returns, I would like that thread to cancel the
> http request.
> My code looks as follows
> {code:title=Example.java|borderStyle=solid}
> // fields
> private final Lock lock;
> private final AtomicBoolean activeSolve;
> private HttpPost post;
> private final CloseableHttpClient httpClient =
> HttpClients.createDefault();
> public String makePost() {
> post = new HttpPost("some url");
> final StringEntity stringEntity = new StringEntity("some json string",
> ContentType.APPLICATION_JSON);
> post.setEntity(stringEntity);
> try {
> lock.lock();
> activeSolve.set(true);
> lock.unlock();
> try (final CloseableHttpResponse httpResponse =
> httpClient.execute(post)) {
> final String response =
> EntityUtils.toString(httpResponse.getEntity());
> return response;
> }
> } catch (IOException e) {
> if (post.isAborted()) {
> log.trace("Web request was aborted");
> return "aborted";
> } else {
> throw new RuntimeException("Could not contact server", e);
> }
> } finally {
> lock.lock();
> activeSolve.set(false);
> lock.unlock();
> }
> }
> public void interrupt() {
> lock.lock();
> if (activeSolve.get()) {
> post.abort();
> }
> lock.unlock();
> }
> {code}
> {code}
> Every ~1000 problems or so, I'll see the following stacktrace:
> java.lang.IllegalStateException: Connection is not open
> at org.apache.http.util.Asserts.check(Asserts.java:34)
> at
> org.apache.http.impl.BHttpConnectionBase.ensureOpen(BHttpConnectionBase.java:132)
> at
> org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseEntity(DefaultBHttpClientConnection.java:177)
> at
> org.apache.http.impl.conn.CPoolProxy.receiveResponseEntity(CPoolProxy.java:172)
> at
> org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:274)
> at
> org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:124)
> at
> org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:271)
> at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
> at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
> at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
> at
> org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
> at
> org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
> at
> org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)
> at ... my classes
> {code}
> If I comment out the interrupt code and disable interrupting, I stop seeing
> this error.
> Am I using the library incorrectly? I can't figure out what circumstances
> cause this to occur.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]