0

SolrJのContentStreamUpdateRequestを使用してsolrにデータを送信すると、次の例外が発生します

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は構成ごとにドキュメントを保存できません。

4

1 に答える 1

0

SolrJを使用しているため、次のように、BinaryRequestWriter を使用するようにRequestWriterを設定することを検討してください。

   solrServer.setRequestWriter(new BinaryRequestWriter());

これにより、データをバイナリ形式で Solr に書き込むことができ、大きなデータ ストリームを XML として送信する際に発生する問題を回避できる可能性があります。

solrconfig.xml 設定で BinaryUpdateRequestHandler が有効になっていることを確認する必要があることに注意してください。

  <requestHandler name="/update/javabin" class="solr.BinaryUpdateRequestHandler" /> 
于 2011-11-08T13:35:17.123 に答える