Apache HttpClient 间歇性工作
Apache HttpClient working intermittently
我对网络开发不是很有经验,所以这可能是初学者的问题。我有一个小项目,在 Tomcats 的两台独立机器上有两个 Java Web 应用程序,一个面向用户(前端,FE 应用程序)并与另一个(后端,BE 应用程序)通信。 BE通过TCP与DB通信,通过REST与FE通信API。问题是 FE 应用程序中使用的 Apache HttpGet 有时仅会到达 BE 应用程序,但通常在 FE 上我会遇到 UnknownHostException。 BE 与 DB 通信或直接从浏览器定位 BE REST API 始终有效。
我应该查看哪些日志,我应该如何设置 Tomcats?默认 Tomcat 日志记录没有给我很多信息,但我想这是一个 Tomcat 配置问题,因为防火墙已关闭,所有其他 TCP 通信都正常工作。下面是我(非常香草)对 Apache HttpGet 的使用:
...
String url = String.format("http://%s/AutoexcludedDBService/nacionalidades", properties.getProperty("dbWebService"));
CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse response = null;
String json = null;
StatusLine statusLine = null;
try {
HttpGet request = new HttpGet(url);
//request.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
request.addHeader("accept", "application/json");
request.addHeader("User-Agent", HTTP.USER_AGENT);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(10000).setConnectTimeout(10000).setSocketTimeout(10000).build();
request.setConfig(requestConfig);
response = client.execute(request);
...
根据你的问题,你的错误信息是"java.net.UnknownHostException"。
来自文档:https://docs.oracle.com/javase/7/docs/api/java/net/UnknownHostException.html
Thrown to indicate that the IP address of a host could not be determined.
此错误消息表明问题出在主机 %s 的名称解析上。
所以看起来你的问题应该是 "why host %a cannot resolve the name of the host %s"(以 xy% 的时间百分比)。
关于您的操作系统的所有其他相关详细信息,该问题不适合 Whosebug,而是 serverfault.com。
但在发布之前,您应该检查 google 您的 OS 结果:"os_name_here host cannot resolve the name"
如果您不确定问题是由于 OS 引起的,而是由于 HttpClient 引起的,您可以将 Apache HttpComponents 的源代码添加到您的项目中,并在抛出 UnknownHostException 的行中打印完整堆栈跟踪而不是向该行添加更多日志记录。
还有另一个线程可以弄清楚如何获取有关 UnknownHostException 的更多详细信息:
How to know the cause of UnknownHostException?
原来问题出在记事本保存带有 BOM 的 UTF-8 属性文件。然后发生的事情是找不到 属性 标识主机,因此解析主机 "null" 导致异常。
我对网络开发不是很有经验,所以这可能是初学者的问题。我有一个小项目,在 Tomcats 的两台独立机器上有两个 Java Web 应用程序,一个面向用户(前端,FE 应用程序)并与另一个(后端,BE 应用程序)通信。 BE通过TCP与DB通信,通过REST与FE通信API。问题是 FE 应用程序中使用的 Apache HttpGet 有时仅会到达 BE 应用程序,但通常在 FE 上我会遇到 UnknownHostException。 BE 与 DB 通信或直接从浏览器定位 BE REST API 始终有效。
我应该查看哪些日志,我应该如何设置 Tomcats?默认 Tomcat 日志记录没有给我很多信息,但我想这是一个 Tomcat 配置问题,因为防火墙已关闭,所有其他 TCP 通信都正常工作。下面是我(非常香草)对 Apache HttpGet 的使用:
...
String url = String.format("http://%s/AutoexcludedDBService/nacionalidades", properties.getProperty("dbWebService"));
CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse response = null;
String json = null;
StatusLine statusLine = null;
try {
HttpGet request = new HttpGet(url);
//request.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
request.addHeader("accept", "application/json");
request.addHeader("User-Agent", HTTP.USER_AGENT);
RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(10000).setConnectTimeout(10000).setSocketTimeout(10000).build();
request.setConfig(requestConfig);
response = client.execute(request);
...
根据你的问题,你的错误信息是"java.net.UnknownHostException"。
来自文档:https://docs.oracle.com/javase/7/docs/api/java/net/UnknownHostException.html
Thrown to indicate that the IP address of a host could not be determined.
此错误消息表明问题出在主机 %s 的名称解析上。
所以看起来你的问题应该是 "why host %a cannot resolve the name of the host %s"(以 xy% 的时间百分比)。
关于您的操作系统的所有其他相关详细信息,该问题不适合 Whosebug,而是 serverfault.com。
但在发布之前,您应该检查 google 您的 OS 结果:"os_name_here host cannot resolve the name"
如果您不确定问题是由于 OS 引起的,而是由于 HttpClient 引起的,您可以将 Apache HttpComponents 的源代码添加到您的项目中,并在抛出 UnknownHostException 的行中打印完整堆栈跟踪而不是向该行添加更多日志记录。
还有另一个线程可以弄清楚如何获取有关 UnknownHostException 的更多详细信息:
How to know the cause of UnknownHostException?
原来问题出在记事本保存带有 BOM 的 UTF-8 属性文件。然后发生的事情是找不到 属性 标识主机,因此解析主机 "null" 导致异常。