Java Solr 6.4: java. net .NoRouteToHostException: Невозможно назначить запрошенный адрес - PullRequest
0 голосов
/ 13 февраля 2020

Я создал консольное приложение 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 таким образом, чтобы настроить ожидание ответа сервера вместо выдачи ошибки?

Спасибо за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...