Ошибка записи в сокет ContentStreamUpdateRequest при отправке больших строк

#java #http #solr #solrj

#java #http #solr #solrj

Вопрос:

Я получаю следующее исключение при отправке данных в solr с использованием ContentStreamUpdateRequest из SolrJ

 Exception in thread "main" org.apache.solr.client.solrj.SolrServerException: java.net.SocketException: Software caused connection abort: socket write error
    at org.apache.solr.client.solrj.impl.CommonsHttpSolrServer.request(CommonsHttpSolrServer.java:478)
    at org.apache.solr.client.solrj.impl.CommonsHttpSolrServer.request(CommonsHttpSolrServer.java:244)
    at com.atosworldline.documentarchiver.core.solr.SolrIndexer.addDocument(SolrIndexer.java:48)
    at com.atosworldline.documentarchiver.core.solr.SolrIndexerTest.main(SolrIndexerTest.java:14)
Caused by: java.net.SocketException: Software caused connection abort: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)
    at org.apache.commons.httpclient.HttpConnection.write(HttpConnection.java:975)
    at org.apache.commons.httpclient.HttpConnection.write(HttpConnection.java:943)
    at org.apache.commons.httpclient.HttpConnection.print(HttpConnection.java:1033)
    at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.print(MultiThreadedHttpConnectionManager.java:1644)
    at org.apache.commons.httpclient.HttpMethodBase.writeRequestLine(HttpMethodBase.java:2218)
    at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2059)
    at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
    at org.apache.solr.client.solrj.impl.CommonsHttpSolrServer.request(CommonsHttpSolrServer.java:422)
    ... 3 more
  

Причина этого исключения в том, что я отправляю двоичные данные документа в solr. Если я удалю это, приложение успешно запустится.
Я использую следующий код для отправки запроса

 SolrServer solrServer = new CommonsHttpSolrServer(url);
ContentStreamUpdateRequest request = new ContentStreamUpdateRequest(EXTRACT);
request.addFile(document);

//request.setParam("literal.id", documentName);
request.setAction(ACTION.COMMIT, true, true);
byte[] byteContent = FileUtils.readFileToByteArray(document);
String base64encodedFile = Base64.byteArrayToBase64(byteContent, 0, byteContent.length);
request.setParam(SolrDBSchema.DOCUMENT.toString(), base64encodedFile);
request.setParam("literal."   SolrDBSchema.OWNER.toString(), owner);
request.setParam("literal."   SolrDBSchema.VALID.toString(), Boolean.toString(valid));
request.setParam("literal."   SolrDBSchema.DATE.toString(), validFor.toString());
request.setParam("literal."   SolrDBSchema.DOCUMENT_TYPE.toString(), documentType);
solrServer.request(request);
  

Я думаю, что строка base64encodedFile слишком длинная для HTTP-запроса, но я не знаю решения этой проблемы. Насколько я знаю, Solr не может сохранить документ по конфигурации.

Ответ №1:

Поскольку вы используете SolrJ, рассмотрите возможность настройки RequestWriter на использование BinaryRequestWriter, например, следующим образом:

    solrServer.setRequestWriter(new BinaryRequestWriter());
  

Это позволит вам записать ваши данные в Solr в двоичном формате и может обойти проблему, с которой вы сталкиваетесь при отправке большого потока данных в виде XML.

Обратите внимание, что вам нужно будет убедиться, что у вас включен BinaryUpdateRequestHandler в вашем solrconfig.xml настройки.

   <requestHandler name="/update/javabin" class="solr.BinaryUpdateRequestHandler" /> 
  

Комментарии:

1. Я все еще получаю то же исключение. Я углубился в код. Проблема в том, что на CommonsHttpSolrServer жестко запрограммировано отправлять параметры в виде HTTP-запроса GET. Если бы я мог отправлять их как POST-запрос, это не было бы проблемой. Поэтому я должен запросить это как новую функцию.