SolrJ遭遇"Broken pipe"

年轻就要对味 2010-07-19

在项目中用到SolrJ访问Solr服务器实现全文检索功能,前段时间都挺正常,今天发现在执行某些搜索时容易出现异常:

2010/07/19 15:24:50 ERROR java.net.SocketException: 管道已断开 (errno:32)
        at java.net.SocketOutputStream.socketWrite0(Native Method)
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:97)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:141)
        at weblogic.servlet.internal.ChunkOutput.writeChunkTransfer(ChunkOutput.java:507)
        at weblogic.servlet.internal.ChunkOutput.writeChunks(ChunkOutput.java:486)
        at weblogic.servlet.internal.ChunkOutput.flush(ChunkOutput.java:382)
        at weblogic.servlet.internal.ChunkOutput$2.checkForFlush(ChunkOutput.java:580)
        at weblogic.servlet.internal.ChunkOutput.write(ChunkOutput.java:306)
        at weblogic.servlet.internal.ChunkOutputWrapper.write(ChunkOutputWrapper.java:146)
        at weblogic.servlet.internal.ServletOutputStreamImpl.write(ServletOutputStreamImpl.java:138)
        at java.io.OutputStream.write(OutputStream.java:58)
        at org.apache.solr.common.util.FastOutputStream.write(FastOutputStream.java:59)
……

<2010-7-19 下午03时24分50秒 GMT+08:00> <Error> <HTTP> <BEA-101020> <[ServletContext@11150740[app:pese module:pese path:/pese spec-version:null]] Servlet failed with Exception
java.lang.IllegalStateException: Response already committed
        at weblogic.servlet.internal.ServletResponseImpl.objectIfCommitted(ServletResponseImpl.java:1586)
        at weblogic.servlet.internal.ServletResponseImpl.sendError(ServletResponseImpl.java:614)
        at org.apache.solr.servlet.SolrDispatchFilter.sendError(SolrDispatchFilter.java:362)
        at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:272)
        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56)
        Truncated. see log file for complete stacktrace

但是从Solr控制台执行搜索时,较少遇到这个异常,在网上搜了一下也没发现有讲得靠谱的人,只能自己解决。在经过N次修改测试后,发现加大

CommonsHttpSolrServer.setConnectionManagerTimeout

的值可以解决问题。该参数官方API的解释是:

Sets soTimeout (read timeout) on the underlying HttpConnectionManager

就是读超时,看来这个应该是比较靠谱的解决方法了。这个值具体调到多少合适还需要实现应用中的网络环境、服务器响应速度等综合起来调整才好,所以建议在应用开发时把这个值做成可配置参数为宜。

相关推荐