nginx+tomcat数据不返回bug
环境
架构:nginx + Tomcat
框架:springMVC
场景:导入账户之后爬取账户的数据
代码:
response为HttpServletResponse
//登录成功 下面代码将登录结果返回前端
OutputStream outputStream = response.getOutputStream();
String result = JsonUtils.writeObject2Json(responseVO);
outputStream.write(result.getBytes());
outputStream.flush();
outputStream.close();
//爬虫抓取数据
bug详情:当response的流进行数据返回的时候,前端不能收到返回直接请求超时.同时爬虫代码已经开始运行!
排查方案:
1.爬虫代码有问题导致不返回.(方向是错的),将爬虫代码注释掉->正常返回
一开始认为是内存问题,爬虫代码里有很多new对象的操作可能是将内存打满了;但是返回是瞬间的事情,爬虫不可能瞬间将内存打满.
2.nginx配置有问题 本地测试前端和后端直接交互不通过nginx ->正常返回
观察nginx日志 debug代码 当执行到outputStream.close()的时候nginx还没有收到返回的日志.同时代码继续往下跑(代码运行是正常的),nginx直到超时才落下200的日志.
问题出在response往nginx返回的时候,当使用response返回的时候,且该条请求对应的线程未结束时,nginx是收不到返回的.当response返回,线程结束后才收到返回.
原因:tomcat的response返回和mvc直接返回不太一样,导致nginx无法收到返回.最后还是没有发现这个问题的根源.
解决方案:
response.close之后的爬虫代码新建一个线程去跑.让请求对应的线程新建完线程之后就结束.(能正常返回)

浙公网安备 33010602011771号