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