java - 生成新索引时 SOLR master 中偶尔出现 SocketTimeoutException

标签 java tomcat solr apr socket-timeout-exception

在主服务器(SOLR 4.5.0)中生成新的 SOLR 索引期间,我收到零星的 SocketTimeoutException

文档以 500 个为一包发送,异常(exception)情况通常发生在添加约 1 或 200 万个文档后。

这是 SOLR 服务器端堆栈跟踪:

java.lang.RuntimeException: [was class java.net.SocketTimeoutException] null
at com.ctc.wstx.util.ExceptionUtil.throwRuntimeException(ExceptionUtil.java:18)
at com.ctc.wstx.sr.StreamScanner.throwLazyError(StreamScanner.java:731)
at com.ctc.wstx.sr.BasicStreamReader.safeFinishToken(BasicStreamReader.java:3657)
at com.ctc.wstx.sr.BasicStreamReader.getText(BasicStreamReader.java:809)
at org.apache.solr.handler.loader.XMLLoader.readDoc(XMLLoader.java:395)
...
Caused by: java.net.SocketTimeoutException
at org.apache.coyote.http11.InternalAprInputBuffer.fill(InternalAprInputBuffer.java:796)
at org.apache.coyote.http11.InternalAprInputBuffer$SocketInputBuffer.doRead(InternalAprInputBuffer.java:827)
at org.apache.coyote.http11.filters.ChunkedInputFilter.readBytes(ChunkedInputFilter.java:243)
at org.apache.coyote.http11.filters.ChunkedInputFilter.parseCRLF(ChunkedInputFilter.java:326)
at org.apache.coyote.http11.filters.ChunkedInputFilter.doRead(ChunkedInputFilter.java:128)
at org.apache.coyote.http11.InternalAprInputBuffer.doRead(InternalAprInputBuffer.java:738)
at org.apache.coyote.Request.doRead(Request.java:428)
at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:304)
at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:405)
at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:327)
at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:162)

SOLR 在 Apache Tomcat(版本 6.0.26)和 JAVA7 上运行。

tomcat server.xml 中的连接器已配置:

<Connector port="1086" protocol="HTTP/1.1" URIEncoding="UTF-8"
    connectionTimeout="600000"
    redirectPort="8443"
    maxThreads="100"
    keepAliveTimeout="5000"
    maxKeepAliveRequests="5"
    minSpareThreads="3"
    maxSpareThreads="10"
    compression="on"
    compressableMimeType="application/octet-stream,text/html,text/xml,text/plain"
/>

我相信 600000(10 分钟)connectionTimeout 也算作 APR 连接器的 socketTimeout。

深入挖掘APR connector code看来空消息是由缺少字符串引起的

throw new SocketTimeoutException(sm.getString("iib.failedread"));

最佳答案

我会回答我自己的问题。

该错误几乎肯定是由 SOLR master 的 tomcat 连接器超时引起的。

事实上,超时值为 5000(5 秒),并且由于已设置为 600000(10 分钟),因此错误不再出现。

关于null消息,它可能是由APR代码中缺少配置字符串引起的

throw new SocketTimeoutException(sm.getString("iib.failedread"));

关于java - 生成新索引时 SOLR master 中偶尔出现 SocketTimeoutException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25971965/

相关文章:

java - 在 Java 中共享一个 ThreadLocal 变量

java - 迷你桶尺寸

java - Tomcat中的默认用户名和密码是什么?

ruby-on-rails - Solr 对比。 Ruby 项目中的 Sphinx

solr - 查找solr性能问题的工具

ruby-on-rails - 按地理位置排序 Solr/sunspot 搜索结果

java - 如何将字符串数组从jsp发送到servlet类

java - JBehave 子场景?

java - 在端口 80 上设置 tomcat 后,PhpMyAdmin 无法访问

java - 每个 session 或每个请求的 Tomcat 安全领域?