Я создал консольное приложение Java, которое запрашивает Solr. Запросы интенсивны, потому что некоторые запросы по идентификатору (около 500 идентификаторов в одном запросе), а некоторые по текстовому свойству. Это приложение является многопоточным, и когда я запускаю его в одном потоке, у меня нет ошибки, но когда я устанавливаю многопоточность, после его запуска в течение некоторого времени , я начинаю получать ошибку ниже:
org.apache.solr.client.solrj.SolrServerException: IOException occured when talking to server at: http://xxx.xxx.xx.xxx:8983/solr/xx
at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:624)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:279)
at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:268)
at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:149)
at org.apache.solr.client.solrj.SolrClient.query(SolrClient.java:942)
at org.apache.solr.client.solrj.SolrClient.query(SolrClient.java:957)
at org.example.ProcessFile.getByPropertyFromSolr(ProcessFile.java:570)
at org.example.ProcessFile.processLinesBulk(ProcessFile.java:226)
at org.example.ProcessFile.importItemsInFile(ProcessFile.java:117)
at org.example.ProcessFile.call(ProcessFile.java:97)
at org.example.ProcessFile.call(ProcessFile.java:56)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.NoRouteToHostException: Cannot assign requested address (Address not available)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:326)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:605)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:440)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:835)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:515)
Это моя зависимость maven:
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>6.4.0</version>
</dependency>
И эта функция выдает ошибку:
private SolrDocument getByPropertyFromSolr(String property, String value){
String urlString = dotenv.get("GAIMP_SOLR_URL");
HttpSolrClient solr = new HttpSolrClient.Builder(urlString).build();
solr.setParser(new XMLResponseParser());
try {
SolrQuery query = new SolrQuery();
query.set("q", property + ":\"" + ClientUtils.escapeQueryChars(value) + "\"");
query.setStart(0);
query.setRows(1);
QueryResponse response = solr.query(query);
SolrDocumentList results = response.getResults();
if (results.size() > 0) {
return results.get(0);
}
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
solr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
Зная, что в однопоточном я не Я считаю, что это происходит из-за того, что серверу Solr требуется много времени для ответа на один запрос, в то время как другой поток запускает другой запрос.
Какие-либо советы, чтобы у меня не было этой ошибки? Могу ли я использовать SolrClient таким образом, чтобы настроить ожидание ответа сервера вместо выдачи ошибки?
Спасибо за любую помощь.