MongoSocketReadTimeoutException: Timeout while receiving message
澳门新葡京官网
澳门新葡京官网
当前位置 : 澳门新葡京官网 > 新葡京娱乐场

MongoSocketReadTimeoutException: Timeout while receiving message

1.最近在使用spring-boot和用spring-data-mongo操作mongodb

2.每天早上查看服务器日志都发现报了同一个错,估计是在一整晚没人访问服务器,第二天一旦有人访问就会发生错误

3.错误日志为:

07:51:35.185 [cluster-ClusterId{value=59295e6c3532f223626a2ca0, description=null}-localhost:27017] INFO  org.mongodb.driver.cluster - Exception in monitor thread while connecting to server localhost:27017 
com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message
    at com.mongodb.connection.InternalStreamConnection.translateReadExceptionInternalStreamConnection.java:477
    at com.mongodb.connection.InternalStreamConnection.receiveMessageInternalStreamConnection.java:228
    at com.mongodb.connection.CommandHelper.receiveReplyCommandHelper.java:134
    at com.mongodb.connection.CommandHelper.receiveCommandResultCommandHelper.java:121
    at com.mongodb.connection.CommandHelper.executeCommandCommandHelper.java:32
    at com.mongodb.connection.InternalStreamConnectionInitializer.initializeConnectionDescriptionInternalStreamConnectionInitializer.java:85
    at com.mongodb.connection.InternalStreamConnectionInitializer.initializeInternalStreamConnectionInitializer.java:45
    at com.mongodb.connection.InternalStreamConnection.openInternalStreamConnection.java:116
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.runDefaultServerMonitor.java:127
    at java.lang.Thread.runThread.java:745
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0Native Method
    at java.net.SocketInputStream.socketReadSocketInputStream.java:116
    at java.net.SocketInputStream.readSocketInputStream.java:171
    at java.net.SocketInputStream.readSocketInputStream.java:141
    at com.mongodb.connection.SocketStream.readSocketStream.java:85
    at com.mongodb.connection.InternalStreamConnection.receiveResponseBuffersInternalStreamConnection.java:494
    at com.mongodb.connection.InternalStreamConnection.receiveMessageInternalStreamConnection.java:224
    ... 8 common frames omitted
07:51:31.683 [cluster-ClusterId{value=59295e583532f22362cf3b92, description=null}-localhost:27017] INFO  org.mongodb.driver.cluster - Exception in monitor thread while connecting to server localhost:27017 
com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message
    at com.mongodb.connection.InternalStreamConnection.translateReadExceptionInternalStreamConnection.java:477
    at com.mongodb.connection.InternalStreamConnection.receiveMessageInternalStreamConnection.java:228
    at com.mongodb.connection.CommandHelper.receiveReplyCommandHelper.java:134
    at com.mongodb.connection.CommandHelper.receiveCommandResultCommandHelper.java:121
    at com.mongodb.connection.CommandHelper.executeCommandCommandHelper.java:32
    at com.mongodb.connection.InternalStreamConnectionInitializer.initializeConnectionDescriptionInternalStreamConnectionInitializer.java:85
    at com.mongodb.connection.InternalStreamConnectionInitializer.initializeInternalStreamConnectionInitializer.java:45
    at com.mongodb.connection.InternalStreamConnection.openInternalStreamConnection.java:116
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.runDefaultServerMonitor.java:127
    at java.lang.Thread.runThread.java:745
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0Native Method
    at java.net.SocketInputStream.socketReadSocketInputStream.java:116
    at java.net.SocketInputStream.readSocketInputStream.java:171
    at java.net.SocketInputStream.readSocketInputStream.java:141
    at com.mongodb.connection.SocketStream.readSocketStream.java:85
    at com.mongodb.connection.InternalStreamConnection.receiveResponseBuffersInternalStreamConnection.java:494
    at com.mongodb.connection.InternalStreamConnection.receiveMessageInternalStreamConnection.java:224
    ... 8 common frames omitted
07:51:35.780 [cluster-ClusterId{value=59295e403532f2236234b535, description=null}-localhost:27017] INFO  org.mongodb.driver.cluster - Exception in monitor thread while connecting to server localhost:27017 
com.mongodb.MongoSocketReadTimeoutException: Timeout while receiving message
    at com.mongodb.connection.InternalStreamConnection.translateReadExceptionInternalStreamConnection.java:477
    at com.mongodb.connection.InternalStreamConnection.receiveMessageInternalStreamConnection.java:228
    at com.mongodb.connection.CommandHelper.receiveReplyCommandHelper.java:134
    at com.mongodb.connection.CommandHelper.receiveCommandResultCommandHelper.java:121
    at com.mongodb.connection.CommandHelper.executeCommandCommandHelper.java:32
    at com.mongodb.connection.InternalStreamConnectionInitializer.initializeConnectionDescriptionInternalStreamConnectionInitializer.java:85
    at com.mongodb.connection.InternalStreamConnectionInitializer.initializeInternalStreamConnectionInitializer.java:45
    at com.mongodb.connection.InternalStreamConnection.openInternalStreamConnection.java:116
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.runDefaultServerMonitor.java:127
    at java.lang.Thread.runThread.java:745
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0Native Method
    at java.net.SocketInputStream.socketReadSocketInputStream.java:116
    at java.net.SocketInputStream.readSocketInputStream.java:171
    at java.net.SocketInputStream.readSocketInputStream.java:141
    at com.mongodb.connection.SocketStream.readSocketStream.java:85
    at com.mongodb.connection.InternalStreamConnection.receiveResponseBuffersInternalStreamConnection.java:494
    at com.mongodb.connection.InternalStreamConnection.receiveMessageInternalStreamConnection.java:224
    ... 8 common frames omitted
08:01:39.239 [cluster-ClusterId{value=59295e583532f22362cf3b92, description=null}-localhost:27017] INFO  org.mongodb.driver.connection - Opened connection [connectionId{localValue:9, serverValue:828}] to localhost:27017 
08:01:39.248 [cluster-ClusterId{value=59295e583532f22362cf3b92, description=null}-localhost:27017] INFO  org.mongodb.driver.cluster - Monitor thread successfully connected to server with description ServerDescription{address=localhost:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 4, 4]}, minWireVersion=0, maxWireVersion=5, maxDocumentSize=16777216, roundTripTimeNanos=340319} 
08:01:39.273 [cluster-ClusterId{value=59295e6c3532f223626a2ca0, description=null}-localhost:27017] INFO  org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:827}] to localhost:27017 
08:01:39.274 [cluster-ClusterId{value=59295e403532f2236234b535, description=null}-localhost:27017] INFO  org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:826}] to localhost:27017 
08:01:39.274 [cluster-ClusterId{value=59295e403532f2236234b535, description=null}-localhost:27017] INFO  org.mongodb.driver.cluster - Monitor thread successfully connected to server with description ServerDescription{address=localhost:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 4, 4]}, minWireVersion=0, maxWireVersion=5, maxDocumentSize=16777216, roundTripTimeNanos=105791} 
08:01:39.274 [cluster-ClusterId{value=59295e6c3532f223626a2ca0, description=null}-localhost:27017] INFO  org.mongodb.driver.cluster - Monitor thread successfully connected to server with description ServerDescription{address=localhost:27017, type=STANDALONE, state=CONNECTED, ok=true, version=ServerVersion{versionList=[3, 4, 4]}, minWireVersion=0, maxWireVersion=5, maxDocumentSize=16777216, roundTripTimeNanos=532381}

4.尝试过一些解决方法,把链接mongodb的代码改成:

new MongoClientnew ServerAddressenv.getProperty"mongo.host", Integer.valueOfenv.getProperty"mongo.port", Arrays.asListcredential, MongoClientOptions.builder
                .socketTimeout10000
                .minHeartbeatFrequency25
                .heartbeatSocketTimeout3000
                .socketKeepAlivetrue
                .build;
                

也把服务器(Ubuntu)ipv4的keep alive时间改成了120秒。

但是错误还在,希望大家指教指教,谢谢!

多半是MongoDB把Java保持的连接踢掉了状态变成CLOSE_WAIT,只能发数据但无法再收到,可以从两个地方想想办法:

  1. 把连接池配置好(这个貌似很复杂),或者干脆不用连接池,即socketKeepAlive设成false

  2. 因为你的问题都出现在早上,可以查下MongoDB有没有凌晨重置连接的策略。

1、可能是遇到了查询时间过长的Read,不妨看看profiling或者server log日志的信息,找到查询时间比较长的语句,例如超过10秒的语句,看是否能优化;

2、适当提高socketTimeout一些,看是否能缓解这种出错的情形。

供参考。

Love MongoDB!Have fun!


2017MongoDB中文社区北京用户组大会在即,2017年6月3日 13:00-18:00

还有T恤等小礼物等!呵呵!

报名请入

栏目列表

广告位

澳门新葡京官网