Class HttpJdkSolrClient
- java.lang.Object
-
- org.apache.solr.client.solrj.SolrClient
-
- org.apache.solr.client.solrj.impl.HttpSolrClientBase
-
- org.apache.solr.client.solrj.impl.HttpJdkSolrClient
-
- All Implemented Interfaces:
Closeable
,Serializable
,AutoCloseable
public class HttpJdkSolrClient extends HttpSolrClientBase
A SolrClient implementation that communicates to a Solr server using the built-in Java 11+ Http Client. This client is targeted for those users who wish to minimize application dependencies. This client will connect to solr using Http/2 but can seamlessly downgrade to Http/1.1 when connecting to Solr hosts running on older versions.- See Also:
- Serialized Form
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
HttpJdkSolrClient.Builder
protected static class
HttpJdkSolrClient.HttpSolrClientCancellable
-
Field Summary
Fields Modifier and Type Field Description protected ExecutorService
executor
protected boolean
headRequested
protected HttpClient
httpClient
-
Fields inherited from class org.apache.solr.client.solrj.impl.HttpSolrClientBase
basicAuthAuthorizationStr, DEFAULT_PATH, defaultParserMimeTypes, FALLBACK_CHARSET, idleTimeoutMillis, parser, requestTimeoutMillis, requestWriter, serverBaseUrl, urlParamNames
-
Fields inherited from class org.apache.solr.client.solrj.SolrClient
defaultCollection
-
-
Constructor Summary
Constructors Modifier Constructor Description protected
HttpJdkSolrClient(String serverBaseUrl, HttpJdkSolrClient.Builder builder)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected String
allProcessorSupportedContentTypesCommaDelimited(Collection<String> processorSupportedContentTypes)
Cancellable
asyncRequest(SolrRequest<?> solrRequest, String collection, AsyncListener<NamedList<Object>> asyncListener)
void
close()
protected String
contentTypeToEncoding(String contentType)
protected boolean
isFollowRedirects()
protected boolean
maybeTryHeadRequest(String url)
This is a workaround for the case where:protected boolean
processorAcceptsMimeType(Collection<String> processorSupportedContentTypes, String mimeType)
NamedList<Object>
request(SolrRequest<?> solrRequest, String collection)
Execute a request against a Solr server for a given collectionCompletableFuture<NamedList<Object>>
requestAsync(SolrRequest<?> solrRequest, String collection)
Execute an asynchronous request against a Solr server for a given collection.protected void
updateDefaultMimeTypeForParser()
-
Methods inherited from class org.apache.solr.client.solrj.impl.HttpSolrClientBase
basicAuthCredentialsToAuthorizationString, calculateQueryParams, changeV2RequestEndpoint, getBaseURL, getIdleTimeout, getParser, getRequestPath, getUrlParamNames, initalizeSolrParams, isMultipart, isV2ApiRequest, processErrorsAndResponse, requestAsync, responseParser, setParser, validateGetRequest, wantStream
-
Methods inherited from class org.apache.solr.client.solrj.SolrClient
add, add, add, add, add, add, add, add, add, add, addBean, addBean, addBean, addBean, addBeans, addBeans, addBeans, addBeans, addBeans, addBeans, commit, commit, commit, commit, commit, commit, deleteById, deleteById, deleteById, deleteById, deleteById, deleteById, deleteById, deleteById, deleteByQuery, deleteByQuery, deleteByQuery, deleteByQuery, getBinder, getById, getById, getById, getById, getById, getById, getById, getById, getContext, getDefaultCollection, optimize, optimize, optimize, optimize, optimize, optimize, ping, ping, query, query, query, query, queryAndStreamResponse, queryAndStreamResponse, queryAndStreamResponse, request, rollback, rollback
-
-
-
-
Field Detail
-
httpClient
protected HttpClient httpClient
-
executor
protected ExecutorService executor
-
headRequested
protected volatile boolean headRequested
-
-
Constructor Detail
-
HttpJdkSolrClient
protected HttpJdkSolrClient(String serverBaseUrl, HttpJdkSolrClient.Builder builder)
-
-
Method Detail
-
asyncRequest
public Cancellable asyncRequest(SolrRequest<?> solrRequest, String collection, AsyncListener<NamedList<Object>> asyncListener)
- Specified by:
asyncRequest
in classHttpSolrClientBase
- Parameters:
solrRequest
- the request to performcollection
- if null the default collection is usedasyncListener
- callers should provide an implementation to handle events: start, success, exception- Returns:
- Cancellable allowing the caller to attempt cancellation
-
requestAsync
public CompletableFuture<NamedList<Object>> requestAsync(SolrRequest<?> solrRequest, String collection)
Description copied from class:HttpSolrClientBase
Execute an asynchronous request against a Solr server for a given collection.- Specified by:
requestAsync
in classHttpSolrClientBase
- Parameters:
solrRequest
- the request to executecollection
- the collection to execute the request against- Returns:
- a
CompletableFuture
that tracks the progress of the async request. Supports cancelling requests viaCompletableFuture.cancel(boolean)
, adding callbacks/error handling usingCompletableFuture.whenComplete(BiConsumer)
andCompletableFuture.exceptionally(Function)
methods, and other CompletableFuture functionality. Will complete exceptionally in case of either anIOException
orSolrServerException
during the request. Once completed, the CompletableFuture will contain aNamedList
with the response from the server.
-
request
public NamedList<Object> request(SolrRequest<?> solrRequest, String collection) throws SolrServerException, IOException
Description copied from class:SolrClient
Execute a request against a Solr server for a given collection- Specified by:
request
in classSolrClient
- Parameters:
solrRequest
- the request to executecollection
- the collection to execute the request against- Returns:
- a
NamedList
containing the response from the server - Throws:
SolrServerException
- if there is an error on the serverIOException
- If there is a low-level I/O error.
-
maybeTryHeadRequest
protected boolean maybeTryHeadRequest(String url)
This is a workaround for the case where:(1) no SSL/TLS (2) using POST with stream and (3) using Http/2
The JDK Http Client will send an upgrade request over Http/1 along with request content in the same request. However, the Jetty Server underpinning Solr does not accept this.
We send a HEAD request first, then the client knows if Solr can accept Http/2, and no additional upgrade requests will be sent.
See https://bugs.openjdk.org/browse/JDK-8287589 See https://github.com/jetty/jetty.project/issues/9998#issuecomment-1614216870
We only try once, and if it fails, we downgrade to Http/1
- Parameters:
url
- the url with no request parameters- Returns:
- true if success
-
close
public void close() throws IOException
- Throws:
IOException
-
isFollowRedirects
protected boolean isFollowRedirects()
- Specified by:
isFollowRedirects
in classHttpSolrClientBase
-
processorAcceptsMimeType
protected boolean processorAcceptsMimeType(Collection<String> processorSupportedContentTypes, String mimeType)
- Specified by:
processorAcceptsMimeType
in classHttpSolrClientBase
-
updateDefaultMimeTypeForParser
protected void updateDefaultMimeTypeForParser()
- Specified by:
updateDefaultMimeTypeForParser
in classHttpSolrClientBase
-
allProcessorSupportedContentTypesCommaDelimited
protected String allProcessorSupportedContentTypesCommaDelimited(Collection<String> processorSupportedContentTypes)
- Specified by:
allProcessorSupportedContentTypesCommaDelimited
in classHttpSolrClientBase
-
-