[eggjs/egg]socket hang up,不好重现

2025-11-20 188 views
1

计划任务中,使用worker类型的任务,每隔1秒,请求一个Tomcat的Servlet,这个Servlet是用来做AI分析的接口,比较耗时。然后执行任务的时候,一部分请求正常,一部分请求疯狂报告错误,如下:

ResponseError: socket hang up (req "error"), GET http://192.168.4.111:7080/XXX/YYY?aaa=4&bbb=8670&ccc=2 -1 (connected: true, keepalive socket: true, agent status: {"createSocketCount":3,"createSocketErrorCount":0,"closeSocketCount":2,"errorSocketCount":0,"timeoutSocketCount":0,"requestCount":3,"freeSockets":{},"sockets":{"192.168.4.111:7080:":1},"requests":{}})
headers: {}
最小可复现仓库

!!!

复现步骤,错误日志以及相关配置

!!!

相关环境信息
  • 操作系统:win7 64
  • Node 版本:v7.7.2
  • Egg 版本:2.4.1

回答

4

这个是 response error ,说明是你那个 tomcat 服务提前断开了连接,socket hang up 代表是没有收到 response 就突然断开了连接

2

这个是 response error ,说明是你那个 tomcat 服务提前断开了连接,socket hang up 代表是没有收到 response 就突然断开了连接

感谢!虽然不知道我写的servlet为什么会这样,但是我把它放在nginx后面,请求突然就全部正常了!怪哉!看来Tomcat容器是不是过时了?

2

@liuquanal 估计是你设置的 keepalive 时间太短,你的计算超过这个时间就断连了

7

node 8.11.1 egg 这个是在 定时任务中执行 每次60并发, 超过120s的 socket 就自动断开了

  • { ResponseError: socket hang up, POST http://192.168.6.1:*/api/*** -1 (connected: true, keepalive socket: true, agent status: {"createSocketCount":48,"createSocketErrorCount":0,"closeSocketCount":25,"errorSocketCount":0,"timeoutSocketCount":23,"requestCount":396,"freeSockets":{"uc.ali.hexin.im:80:":1,"themis.ali.hexin.im:80:":1,"192.168.6.128:8018:":1},"sockets":{"192.168.6.128:8018:":20},"requests":{}}, socketHandledRequests: 2, socketHandledResponses: 1)
9

一个请求 http://192.168.6.1:*/api/*** 120s 都没响应???

4

抱歉找到原因了:

第一步

https://nodejs.org/docs/latest-v8.x/api/http.html#http_request_settimeout_timeout_callback

  • request.setTimeout(timeout[, callback])# Added in: v0.5.9 timeout Milliseconds before a request times out. callback Optional function to be called when a timeout occurs. Same as binding to the timeout event. If no socket is assigned to this request then socket.setTimeout() will be called immediately. Otherwise socket.setTimeout() will be called after the assigned socket is connected.

Returns request.

第二 步

` /**

服务器端要设置 serverTimeout

1

一个请求超过 120s 的话,应该去审视下是否合理