I think this relates to a HttpClient behaviour that limits the maximum
connections to a given service
At least in how Jena sets it up the default is 5 connections per service which
is more generous than the HTTP client defaults. Jena appears to read this from
a JVM property http.maxConnections OR you can construct your own client by
calling setMaxConnPerRoute() and setMaxConnTotal() on the builder to set your
desired settings.
Rob
On 08/12/2017, 16:44, "Dave Reynolds" <[email protected]> wrote:
Hi,
I've being updating some rather old libraries that use Jena to issue
sparql requests to a remote endpoint and pull back results.
These work under Jena 3.1.1 but there's a fatal problem under Jena
3.2.0
and later ...
If I issue 6 concurrent execSelect calls to a remote sparql endpoint
(happens to be fuseki) then 5 will get issued and return correctly but
#6 will not and from then onwards no further remote calls will go
through. This only happens if at least 5 requests are in flight with no
response yet from the remote endpoint before the final one is issued.
It's hard to produce a deterministic, standalone test case because by
definition it depends on an external sparql endpoint being reliably
there and reliably not too fast :)
Looking at the stack trace I see:
Unsafe.park(boolean, long) line: not available [native method]
LockSupport.park(Object) line: 175
AbstractQueuedSynchronizer$ConditionObject.await() line: 2039
CPool(AbstractConnPool<T,C,E>).getPoolEntryBlocking(T, Object, long,
TimeUnit, Future<E>) line: 377
AbstractConnPool<T,C,E>.access$200(AbstractConnPool, Object, Object,
long, TimeUnit, Future) line: 67
AbstractConnPool$2.get(long, TimeUnit) line: 243
AbstractConnPool$2.get(long, TimeUnit) line: 191
PoolingHttpClientConnectionManager.leaseConnection(Future<CPoolEntry>,
long, TimeUnit) line: 282
PoolingHttpClientConnectionManager$1.get(long, TimeUnit) line: 269
MainClientExec.execute(HttpRoute, HttpRequestWrapper, HttpClientContext,
HttpExecutionAware) line: 191
ProtocolExec.execute(HttpRoute, HttpRequestWrapper, HttpClientContext,
HttpExecutionAware) line: 185
RetryExec.execute(HttpRoute, HttpRequestWrapper, HttpClientContext,
HttpExecutionAware) line: 89
RedirectExec.execute(HttpRoute, HttpRequestWrapper, HttpClientContext,
HttpExecutionAware) line: 111
InternalHttpClient.doExecute(HttpHost, HttpRequest, HttpContext) line: 185
InternalHttpClient(CloseableHttpClient).execute(HttpUriRequest,
HttpContext) line: 83
InternalHttpClient(CloseableHttpClient).execute(HttpUriRequest,
HttpContext) line: 56
HttpOp.exec(String, HttpUriRequest, String, HttpResponseHandler,
HttpClient, HttpContext) line: 1081
HttpOp.execHttpGet(String, String, HttpResponseHandler, HttpClient,
HttpContext) line: 308
HttpOp.execHttpGet(String, String, HttpClient, HttpContext) line: 367
HttpQuery.execGet() line: 326
HttpQuery.exec() line: 288
QueryEngineHTTP.execResultSetInner() line: 348
QueryEngineHTTP.execSelect() line: 340
SSResultSet.<init>(BaseSparqlSource, String) line: 33
RemoteSparqlSource(BaseSparqlSource).streamableSelect(String) line: 59
Which suggests some problem with the connection pool locking.
I've tried 3.4.0 and 3.5.0 which incorporate the fix to JENA-1335 (in
case that's related) but no luck.
I've tried both:
HttpOp.setDefaultHttpClient(HttpClients.createMinimal());
and
HttpOp.setDefaultHttpClient(HttpClients.createDefault());
right at the start of application startup.
Which don't fix the problem. Though perhaps I'm getting the sequence
of
where to set those wrong.
Any suggestions?
Any pointers to documentation on how to configure the http client set
up
in current Jena versions?
Thanks,
Dave