[英]Odd unknown host exception
我的服務器遇到一些奇怪的異常。 服務器正在調用后端服務,並且在“正常”操作期間可以正常運行,但是,如果該服務在短時間內出現故障,則我的服務器將完全關閉。 后端服務重新啟動后,我的所有http調用都收到未知的主機異常。 如果我重新啟動服務器,它可以再次運行,但是我什至首先遇到錯誤似乎很奇怪。
我撥打電話的示例:
Client client = ClientBuilder.newClient();
response = client.target(uri)
.request(MediaType.APPLICATION_JSON_TYPE)
.header("XApiKey", catalogApiKey)
.get();
並且stacktrace是相當標准的:
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服務器上運行。
什么會導致這種行為?
如果您查看InetAddress
的來源(例如, http : UnknownHostException
), UnknownHostException
到處都是UnknownHostException
實例化時,使用host
字符串或明顯非空的字符串作為構造函數參數進行實例化。
但是,stacktrace中的異常似乎有一個空message
。 因此,我推斷代碼正在對一個空字符串的主機名進行查找。
發生此問題時,我將添加一些代碼以打印uri
的值。 我懷疑這在某種程度上是虛假的。
Java緩存DNS條目。 默認值為“永久”,如$JAVA_HOME/jre/lib/security/java.security
中條目networkaddress.cache.ttl
下的定義。
我鼓勵您考慮將“正數”緩存減少到少量,大概10秒左右。 您可以修改java.security
文件或使用類似以下的代碼:
java.security.Security.setProperty("networkaddress.cache.ttl", "10");
在您的代碼中。 還有一個“負”緩存,用於緩存失敗的條目。 在您的環境中,可能需要對正負緩存進行一些試驗才能找到正確的設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.