当前位置: 首页 > 知识库问答 >
问题:

Wiremock-有时会抛出“软件导致连接中止:recv失败”

苏鹏鹍
2023-03-14

在使用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);

奇怪的是:

    < li >相同的测试在我的本地计算机上运行没有任何问题-如果单独运行的话 < li >在我的机器上运行所有测试时,有时相同的测试会失败,有时不会 < li >每次只有这个测试失败;没有其他测试失败 < li >当在Jenkins上运行测试时,它100%失败

共有3个答案

张嘉熙
2023-03-14

在使用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);
    }
}
阙阳
2023-03-14

太长别读了

< 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 进行测试

耿志义
2023-03-14

在对此进行了一些挖掘之后,我遇到了几乎 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