如何解决MockServer Java客户端调用时出现的SocketTimeout异常
MockServer Java客户端超时问题解决方案
问题背景
我计划使用mockserver模拟请求与响应,因此采用了mockserver官方docker镜像进行部署,使用的docker-compose配置示例如下:
mockServer: image: mockserver/mockserver container_name: mockhttpserver ports: - 1080:1080
为了添加期望规则,引入了如下mockserver java客户端依赖:
<dependency> <groupId>org.mock-server</groupId> <artifactId>mockserver-client-java</artifactId> <version>5.11.2</version> </dependency>
创建MockServerClient并添加期望的Java代码如下,运行时抛出SocketTimeout异常。目前已确认MockServer容器运行正常,telnet mylocalhost.org 1080可成功连通,curl调用REST API添加期望也可以正常执行,仅在Eclipse中运行Java代码会触发异常:
MockServerClient client = new MockServerClient("mylocalhost.org", 1080); client.upsert( Expectation.when(HttpRequest.request("/login") .withMethod("get")) .thenRespond(HttpResponse.response().withStatusCode(200))); client.close();
异常信息如下:
8:11:18.768 [MockServer-MockServerClient-eventLoop0] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.linkCapacity: 16 08:11:18.768 [MockServer-MockServerClient-eventLoop0] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.ratio: 8 Exception in thread "main" org.mockserver.client.SocketCommunicationException: Response was not received from MockServer after 20000 milliseconds, to wait longer please use "mockserver.maxSocketTimeout" system property or ConfigurationProperties.maxSocketTimeout(long milliseconds) at org.mockserver.client.NettyHttpClient.sendRequest(NettyHttpClient.java:172) at org.mockserver.client.MockServerClient.sendRequest(MockServerClient.java:211) at org.mockserver.client.MockServerClient.sendRequest(MockServerClient.java:244) at org.mockserver.client.MockServerClient.upsert(MockServerClient.java:1109)
正常可用的REST API调用方式如下:
curl -v -X PUT "http://mylocalhost.org:1080/mockserver/expectation"
解决方案
- 版本一致性校验:确认Docker部署的MockServer服务端版本和Java客户端版本一致,当前客户端版本为5.11.2,可将docker-compose配置中的镜像修改为带版本号的
mockserver/mockserver:5.11.2,重启容器后重试。版本不兼容是此类超时问题最常见诱因。 - 调整IDE网络配置:进入Eclipse的「窗口-首选项-网络连接」设置页,将Active Provider修改为「直连」,排除IDE代理规则拦截本地请求的可能。
- 显式配置客户端参数:
- 拉长超时时间:可在Java程序启动参数中添加
-Dmockserver.maxSocketTimeout=60000,或者通过代码提前配置:
ConfigurationProperties.maxSocketTimeout(60000);- 指定通信协议:curl调用使用的是HTTP协议,可在初始化客户端时显式关闭HTTPS:
MockServerClient client = new MockServerClient("mylocalhost.org", 1080, false); - 拉长超时时间:可在Java程序启动参数中添加
- 域名解析校验:检查本地hosts文件中
mylocalhost.org的映射地址是否正确,确保Java程序解析域名得到的是MockServer服务实际部署的IP地址。
内容的提问来源于stack exchange,提问作者keepmoving
相关产品推荐
相关产品推荐

