我的服务器遇到了一些奇怪的例外。 服务器正在调用后端服务,并在正常情况下进行调用。操作无故障,但如果该服务短时间内停机,我的服务器完全死机。 后端服务重新启动后,我的所有http调用都会收到未知的主机异常。 如果我重新启动我的服务器它会再次运行,但是我甚至首先得到错误似乎很奇怪。
我打电话的一个例子:
Client client = ClientBuilder.newClient();
response = client.target(uri)
.request(MediaType.APPLICATION_JSON_TYPE)
.header("XApiKey", catalogApiKey)
.get();
并且堆栈跟踪相当标准:
java.net.UnknownHostException.
at java.net.InetAddress.getAllByName0(InetAddress.java:1280)
at java.net.InetAddress.getAllByName(InetAddress.java:1192)
at java.net.InetAddress.getAllByName(InetAddress.java:1126)
at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.resolveHostname(DefaultClientConnectionOperator.java:259)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:159)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:882)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:55)
at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:283)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:436)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocationBuilder.get(ClientInvocationBuilder.java:159)
如果它是相关的,我在Wildfly服务器上运行。
什么可能导致这种行为?
答案 0 :(得分:0)
如果你查看InetAddress
的所有来源(例如)
UnknownHostException
被实例化,它会被host
字符串或明显非空的实例化string作为构造函数参数。
但是,堆栈跟踪中的异常似乎为空message
。所以我推断代码正在对一个空字符串的主机名进行查找。
发生此问题时,我会添加一些代码来打印uri
的值。我怀疑(偶尔)以某种有趣的方式伪造。
答案 1 :(得分:0)
Java缓存DNS条目。默认值为“永久”,如条目$JAVA_HOME/jre/lib/security/java.security
下的networkaddress.cache.ttl
中所定义。
我建议您考虑将“正”缓存减少到少量,可能是10秒左右。您可以修改java.security
文件或使用以下代码:
java.security.Security.setProperty("networkaddress.cache.ttl", "10");
在你的代码中。还有一个“负”缓存可缓存失败的条目。您可以在您的环境中使用正面和负面缓存进行一些实验,以找到正确的设置。