#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-запрос, это не было бы проблемой. Поэтому я должен запросить это как новую функцию.