奇怪的未知主机异常

时间:2018-01-09 10:44:42

标签: java networking wildfly

我的服务器遇到了一些奇怪的例外。 服务器正在调用后端服务,并在正常情况下进行调用。操作无故障,但如果该服务短时间内停机,我的服务器完全死机。 后端服务重新启动后,我的所有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服务器上运行。

什么可能导致这种行为?

2 个答案:

答案 0 :(得分:0)

如果你查看InetAddress的所有来源(例如enter image description hereUnknownHostException被实例化,它会被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");

在你的代码中。还有一个“负”缓存可缓存失败的条目。您可以在您的环境中使用正面和负面缓存进行一些实验,以找到正确的设置。