在使用Spring和Wiremock进行集成测试时,我遇到了一个非常奇怪的情况:突然间歇性地开始失败。以下错误片段:
org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:10314/my/endpoint": Software caused connection abort: recv failed; nested exception is java.net.SocketException: Software caused connection abort: recv failed
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:785) ~[spring-web-5.3.7.jar:5.3.7]
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711) ~[spring-web-5.3.7.jar:5.3.7]
at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:468) ~[spring-web-5.3.7.jar:5.3.7]
... more logs here ...
上下文如下:我添加了一个新的测试,该测试使用wiremock来存根响应:
wireMockServer.stubFor(WireMock.post("/my/endpoint")
.withRequestBody(containing(aJsonRequestBodyHere))
.willReturn(aResponse()
.withBody(aJsonResponseHere)
.withStatus(HttpStatus.OK.value())
.withHeader(HttpHeader.CONTENT_TYPE.toString(), CONTENT_TYPE_APPLICATION_JSON)));
对这个存根endpoint的调用如下:
given()
.when()
.get("my/endpoint")
.then()
.body(containsString(theExpectedJsonResponse)))
.statusCode(200);
奇怪的是:
在使用WireMock服务器通过Feign客户端发送请求时,在集成测试中遇到了同样的问题。
根据Tom在上一个回答中的评论决定修复客户端的配置,以便假装重试发送请求。找到了本文中描述的解决方案。
Feign最简单的方法是添加<code>@Configuration</code>class和<code>foreign。重试器@Bean
:
@Configuration
public class FeignConfig {
@Bean
public Retryer retryer() {
return new Retryer.Default(200L,1000L,5);
}
}
太长别读了
< code >的解决方法。withHeader(HttpHeaders。连接,“关闭”)上的响应修复:
org.springframework.web.client.ResourceAccessException:
"I/O error on POST request for "http://127.0.0.1:8080/wiremock/my_stubbed_service": Software caused connection abort: recv failed"
使用 com.github.tomakehurst:wiremock:2.27.2 和 com.github.tomakehurst:wiremock-jre8:2.30.1 进行测试
在对此进行了一些挖掘之后,我遇到了几乎 100% 描述我的情况的这篇文章和这篇文章。
根本原因似乎是测试执行得太快了——可能是那些没有做太多事情的测试——而Wiremock没有时间为下一个测试进行正确的设置。我通过在测试开始时添加一个< code>Thread.sleep(2000)来测试这个假设,然后多次运行所有测试——所有测试都顺利通过。
解决方案在第一篇文章中提出:注册一个Transform类,该类将拦截所有响应并为它们添加一个Conntions=关闭
标头。
更详细地说:我添加了一个Transformer
类,它扩展了ResponseDefinitionTransformer
,并在每个响应上添加了连接
头。然后我创建了@Configuration
注释类,并注册了这个Transformer
变压器类(取自第一篇文章):
public class NoKeepAliveTransformer extends ResponseDefinitionTransformer {
@Override
public ResponseDefinition transform(Request request, ResponseDefinition responseDefinition, FileSource files, Parameters parameters) {
return ResponseDefinitionBuilder.like(responseDefinition)
.withHeader(HttpHeaders.CONNECTION, "close")
.build();
}
@Override
public String getName() {
return "keep-alive-disabler";
}
}
配置类:
@Configuration
public class WiremockConfiguration {
@Bean
WireMockConfigurationCustomizer optionsCustomizer() {
return options -> options.extensions(NoKeepAliveTransformer.class);
}
}
问题内容: Netbeans IDE中的Java,Hibernate,MySQL项目中出现异常。 我做了一些挖掘工作,以尝试修复此奇怪的Socket异常,但无济于事。 一些论坛解决方案建议为Hibernate实现c3p0连接池。没有修复。 其他人建议禁用AV和防火墙(!!),因为它们可能会干扰套接字连接。没有修复。 我已经用Hibernate标记了这个问题,因为我不确定是休眠的原因,但是异常发生在
问题内容: 我已经遇到了几天的问题,这是详细信息堆栈信息: 我想通过mybatis和spring更新mysql中的一条记录,然后一个接一个地更新它,下面是mybatis config:更新建议集count =#{count},version =#{version},freq =#{freq}其中id =#{id} 以及服务代码: 有人可以帮我吗?非常感谢。 问题答案: 你的mySQL连接在连接池识
我正在使用Jeter在apache服务器上发布消息。我使用ssl(提供证书在. pfx格式)发送消息,但得到下面的错误: java.net.SocketException:软件导致连接中止:recv 在 java.net.SocketInputStream.read(Unknown Source) 在 java.net.SocketInputStream.read(Unknown Source)
问题内容: 这个问题已经在这里有了答案 : “软件导致连接中止:套接字写入错误”的官方原因 (14个答案) 3年前关闭。 所有。我已经遇到了几天的问题,这是详细信息堆栈信息: 我想通过mybatis和spring更新mysql中的一条记录,然后一个接一个地更新它,下面是mybatis config:更新建议集count =#{count},version =#{version},freq =#{f
问题内容: 我找到了客户端/服务器代码,但出现此错误: java.net.SocketException:软件导致连接中止:recv失败 服务器代码: 客户代码: 服务器代码提供以下输出: 客户端代码给出以下输出: 问题答案: 服务器不等待来自客户端的任何数据,并且当服务器退出时,连接将关闭。 将这样的代码添加到服务器代码中:
问题内容: 尝试部署Java应用程序时遇到问题。 要么 在 pom.xml中, 我有这个: 在 tomcat-users.xml中, 我有以下内容: 同样在 Maven / conf / settings.xml中, 我有: 当我试图去 并输入用户名和密码(管理员admin)我有错误: 但是我输入了 tomcat-users.xml ,该用户admin具有manager-gui角色。我正在使用To