我有两个Spring Boot服务A和B。还有一个外部服务C。这是请求路径:
网络浏览器
外部服务正在返回一个返回前端的资源。为了在A、B和C之间进行通信,我使用了Rest模板。进入Web应用程序时一切都很好,但是一旦我运行并行运行的BDD测试(9个线程),我就会在调用外部服务C时在服务B中获得NoHttp响应异常。
org.apache.http.NoHttpResponseException Service_C failed to respond
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:141)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
这是我的Rest模板配置:
@Bean
public RestTemplate restTemplateExternal() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
HttpComponentsClientHttpRequestFactory requestFactory = getRequestFactoryWithDisabledSSLValidation();
RestTemplate restTemplate = new RestTemplate(requestFactory);
return restTemplate;
}
private HttpComponentsClientHttpRequestFactory getRequestFactoryWithDisabledSSLValidation() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
SSLContext sslContext = SSLContexts.custom()
.loadTrustMaterial(null, acceptingTrustStrategy)
.build();
SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.setSSLSocketFactory(csf)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
return requestFactory;
}
我已经尝试调用ConnectionManager.setValidateAfterInactive(0);
但没有帮助。
让我补充一点,从服务B到外部服务C的所有请求都指向同一个endpoint。只有参数(x)在变化:/资源?参数={x}
老实说,我不是100%确定HttpClient是否会与每个服务请求一起创建(RestTemplate bean是单例的),还是每个服务只有一个实例?
也许我需要在连接管理器中设置DefaultMaxPerRoute?如果是,那么如何区分正确的数字?如果能简单介绍一下在这种情况下如何正确配置RestTemplate,我将不胜感激。
如果希望在日志中看到重试,可以使用如下重试解决方案:
private void addRetryHandler( HttpClientBuilder httpClientBuilder ) {
logger.debug("adding retry handler to httpClient");
httpClientBuilder.setRetryHandler(( exception, executionCount, context ) -> {
if (executionCount > 3) {
logger.debug("Maximum http request tries reached for client http pool ");
return false;
}
if (exception instanceof org.apache.http.NoHttpResponseException) {
logger.debug("No response from server on {} call, got NoHttpResponseException", executionCount);
return true;
}
return false;
});
}
问题可能是因为响应包含标题connections=close
。因此,一个连接被关闭,但下一个请求尝试重用现有连接(已关闭)并获取错误。
setRetryHandler
在第一次连接重用时总是失败,但在第二次重试时启动新连接并成功。
您可以通过以下行禁用以重用连接:httpClient。SetReuseStragy(新的NoConnectionReuseStragy())
看起来这里有一个类似的问题:获取NoHttp响应异常进行负载测试
尝试使用clientBuilder.setRetryHandler(new DefaultHttpRequest estRetryHandler(3, true));
,它成功了。如果有人能更深入地解释这个问题,我仍然会很感激。
Selenium Webdriver(2.53)和java(jdk 7)。Mozilla Firefox ESR(45.2.0)在页面打开时立即崩溃,并显示错误消息: 出错
Apache Kafka:分布式消息传递系统 Apache Storm:实时消息处理 我们如何在实时数据管道中使用这两种技术来处理事件数据? 在实时数据管道方面,我觉得两者做的工作是一样的。如何在数据管道上同时使用这两种技术?
我正在尝试从servlet(viewcurrentstock.java)检索一个属性到jsp(viewstock.jsp)。这里有一个例外提示:“org.apache.jasper.JasperException:java.lang.NullPointerException” 查看当前股票。JAVA viewstock.jsp 服务器日志:
我为在线DVD商店创建了一个EJB应用程序。我使用Netbean 7.2.1和Glassfish 3.1.2当我运行index.jsp时,它的界面启动成功,如果我单击表单提交按钮,我会收到此错误: 在Netbean中,我得到了这个错误: 我创建了一个JavaEE企业应用程序。我有项目ejb和项目战争。因为我无法直接从ejb创建SessionBean,所以我创建了一个新的项目/Java库类,并在那里
您是否了解为SOAP客户端应用程序设置Axis2和Rampart? 我通过Eclipse将Axis2和Rampart的jar文件添加到构建路径中,并将Rampart的jar和mar文件添加到Axis的文件结构中。 我在Axis/Rampart设置中出错,但我不知道… 这就是日志给我的全部内容: com.good.gc10.故障:无法在com.good.gcTalk实例化GCServiceStub。
我想写一份工作,可以分析youtube数据集中的一些信息。我相信我已经在driver类中正确设置了map的输出键,但是我仍然得到了上面的错误,我在这里发布了代码和异常, 地图绘制者 减速器等级 驱动程序类 我得到的例外 Java语言io。IOException:映射中的键类型不匹配:应为组织。阿帕奇。hadoop。io。文本,接收组织。阿帕奇。hadoop。io。可在组织中长写。阿帕奇。hadoo