我在集成测试中启动了一个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)
答案 0 :(得分:0)
Apache HttpClient有时会遭受NoHttpResponseException
的困扰。这是一个非常老的问题。
无论如何,我想就您而言,问题可能是由于在测试之间重新启动WireMock服务器而引起的,同时,Apache HttpClient池化HTTP连接并尝试在测试之间重用它们。如果是这样,有两种解决方法:
在测试中禁用池化HTTP连接。这是有道理的,因为在测试执行期间可以重新启动WireMock服务器被认为是正常的。另外,您也可以设计WireMock存根以始终在标头中发送"Connection": "close"
。结果将是相同的。
从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
在版本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