id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	due_date
107	xindex上线后出现的异常处理	yuanhuoqing	yuanhuoqing	"index上线后的出现了两个异常，一个xindex服务端的连接重新定位异常，每隔4分钟又一分钟出现，非常有规律，异常信息如下：


{{{
java.io.IOException: Connection reset by peer
        at sun.nio.ch.FileDispatcher.read0(Native Method)
        at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:21)
        at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:233)
        at sun.nio.ch.IOUtil.read(IOUtil.java:200)
        at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:236)
        at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:323)
        at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:282)
        at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:202)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
        at java.lang.Thread.run(Thread.java:619)
}}}



一个是应用端（也是客户端）出现空指针异常，即客户端去请求时返回null结果，这个异常导致页面应该是无返回结果的，但页面的返回状态码是200，所以先在页面对异常进行扑捉，并返回404的状态码，直接不让爬虫来爬了。但为什么抛出这个异常还弄清楚。
异常信息如下：
{{{
	[04-24 09:26:18.877] java.lang.NullPointerException
[04-24 09:26:18.878]    at cn.com.pconline.core.pricefront.service.ProductXIndexService.getResultFromXIndex(ProductXIndexService.java:269)
[04-24 09:26:18.879]    at cn.com.pconline.core.pricefront.service.ProductXIndexService.getResultFromXIndex(ProductXIndexService.java:244)
[04-24 09:26:18.879]    at _jsp._price__jsp._jspService(_price__jsp.java:357)
[04-24 09:26:18.879]    at com.caucho.jsp.JavaPage.service(JavaPage.java:61)
[04-24 09:26:18.879]    at com.caucho.jsp.Page.pageservice(Page.java:578)
[04-24 09:26:18.879]    at com.caucho.server.dispatch.PageFilterChain.doFilter(PageFilterChain.java:195)
[04-24 09:26:18.879]    at com.caucho.server.webapp.DispatchFilterChain.doFilter(DispatchFilterChain.java:97)
[04-24 09:26:18.879]    at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:265)
[04-24 09:26:18.879]    at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:293)
[04-24 09:26:18.879]    at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:111)
[04-24 09:26:18.879]    at cn.com.pconline.core.pricefront.view.filter.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:478)
[04-24 09:26:18.879]    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87)
[04-24 09:26:18.879]    at cn.com.pconline.core.pricefront.util.EnvFilter.doFilter(EnvFilter.java:49)
[04-24 09:26:18.879]    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87)
[04-24 09:26:18.880]    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
[04-24 09:26:18.880]    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
[04-24 09:26:18.880]    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87)
[04-24 09:26:18.880]    at com.caucho.server.cache.CacheFilterChain.doFilter(CacheFilterChain.java:192)
[04-24 09:26:18.880]    at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:187)
[04-24 09:26:18.880]    at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:265)
[04-24 09:26:18.880]    at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:273)
[04-24 09:26:18.880]    at com.caucho.server.port.TcpConnection.run(TcpConnection.java:682)
[04-24 09:26:18.880]    at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:730)
[04-24 09:26:18.880]    at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:649)
}}}
   
    这个两个异常在出现的时间点有些相近，崇绮初以为是服务端的底层在定时做心跳监测主动断了连接，导致客户端的请求的返回是null，后来请教了小虎，应该不会这种情况，小虎怀疑是服务端的连接池的链接数不够，所以增加了连接数，但异常仍然出现，小虎后来提醒这么有规律的会不会是网络那边做了监控引起的，后来咨询了网络，果然是配了对xindex的服务端端口11311的监控，监控发的是半连接，只握手后没作回答的，所以服务端的会主动去重置连接，因此判断服务端的异常跟客户端的异常是没有关系的。
    

然后应用这边配上出现空指针异常时的日志，发现发送给服务端命令查找的是没有索引的，是去查找一个禁止状态的小类的产品，这个url在页面应该是没有入口的，一般是爬虫或者搜索引擎收录的url过来的，所以是避免不了的，作异常处理下即可。

 通过处理此异常总结如下：
 1、果断加日志去验证猜测的是否正确。（如这个xindex的客户端报的这个空指针异常开始以为发的请求的命令去查没有索引的数据会返回总数为0等相关信息，但加上日志后看这个猜测是错误的）；
 2、如果出现比较有规律的异常的话向网络是否配了相关监控有关这方面想想。"	Bug	closed	major	2012报价库5.0	报价库	报价库5.0	fixed	xindex		26/04/2012
