在詹金斯上运行Wiremock时如何解决“ NoHttpResponseException”?

时间:2019-04-11 04:22:54

标签: spring-boot wiremock

我在集成测试中启动了一个Wiremock服务器。

我的本​​地BUT中的IT传递在 jenkins服务器中失败了,错误是

localhost:8089 failed to respond; nested exception is org.apache.http.NoHttpResponseException: localhost:8089 failed to respond

我尝试在测试中添加sleep(3000),可以解决问题,但是我不知道问题的根本原因,因此解决这个问题不是一个好主意

我还尝试使用@AutoConfigureWireMock(port=8089)代替WireMockServer来启动Wiremock服务器,这可以解决问题,但是我不知道如何使用注释{对Wiremock服务器进行一些配置{1}}。

这是我的代码来启动Wiremock服务器,是否有任何建议可修复“ NoHttpResponseException”?

@AutoConfigureWireMock(port=8089)

3 个答案:

答案 0 :(得分:0)

Apache HttpClient有时会遭受NoHttpResponseException的困扰。这是一个非常老的问题。

无论如何,我想就您而言,问题可能是由于在测试之间重新启动WireMock服务器而引起的,同时,Apache HttpClient池化HTTP连接并尝试在测试之间重用它们。如果是这样,有两种解决方法:

  1. 在测试中禁用池化HTTP连接。这是有道理的,因为在测试执行期间可以重新启动WireMock服务器被认为是正常的。另外,您也可以设计WireMock存根以始终在标头中发送"Connection": "close"。结果将是相同的。

  2. 从Apache HttpClient切换到Square OkHttp。 OkHttp虽然默认情况下会合并http连接,但始终能够从过时的连接中正常恢复。不幸的是,Apache的库不是很聪明。

答案 1 :(得分:0)

Coorect,正如G. Demecki所写,与Wiremock无关。 与您的应用服务器(称为Wiremock)有关。如今,重用连接以提高微服务基础架构的性能已经很普遍。因此,connection-close-header,RequestScoped客户端等不起作用。

检查apache http客户端:

httpclient-4.5.2 - PoolingHttpClientConnectionManager

documentation

在版本4.4中更改了过时连接的处理。以前,该代码默认情况下会在重新使用之前检查每个连接。现在,该代码仅在自上次使用连接以来所经过的时间超过已设置的超时时,才检查连接。默认超时设置为2000ms

每次销毁一个模拟端点,并为一个新的测试类创建一个新端点时,都需要2秒钟,直到您的应用程序检测到以前的连接已断开,并且必须打开一个新的端点。 如果您不等待2秒,则可能会抛出NoHttpResponseException,这取决于最后一次检查。

因此Thread.sleep(2000);看起来很丑。但这还算不错,只要我们知道为什么需要这样做即可。

答案 2 :(得分:0)

在这种情况下对我们有用的解决方案只是向Apache客户添加重试:

@Configuration
public class FeignTestConfig {

    @Bean
    @Primary
    public HttpClient testClient() {
        return HttpClientBuilder.create().setRetryHandler((exception, executionCount, context) -> {
            if (executionCount > 3) {
                return false;
            }
            return exception instanceof org.apache.http.NoHttpResponseException || exception instanceof SocketException;
        }).build();
    }
}

那里也有套接字异常,因为有时会抛出此异常而不是NoHttpResponse