2

java.net.UnknownHostException がスローされたときにタイムアウトを確認/設定する場所は?

ときどき、コードが存在しない場所に接続しようとし、java.net.UnknownHostException をスローします。これは、アプリで許容されるケースです。

私が抱えている問題は、例外がスローされるまでに約 20 秒かかり、アプリケーション全体の速度が低下することです。

Web サーバーのバージョンは Tomcat 7.0.37 です。次のコネクタの server.xml でタイムアウト設定を (2 秒に) 変更しようとしました。

Connector port="8009" protocol="AJP/1.3" redirectPort="8443" connectionTimeout="2000"
Connector port="8080" protocol="HTTP/1.1" connectionTimeout="2000" redirectPort="8443"

HttpURLConnection を使用しているため、ポート 8080 の接続タイムアウト設定が有効になることを期待していますが、そうではないようです。

また、コード内でタイムアウトを設定しようとしました:

HttpURLConnection connection = (HttpURLConnection)url.openConnection();  
connection.setConnectTimeout(1000);  
Reader reader= new InputStreamReader((InputStream) connection.getContent());

しかし、これもうまくいきませんでした。何か不足していますか?

4

2 に答える 2

1

おそらくDNSでホストを検索するのに時間が費やされています.あなたの場合、見つからないホストを検索しようとするとタイムアウトしているようです. これは、接続先の DNS サーバーが要求を別の DNS サーバーに転送し、適切に構成されていないために妥当な時間内に応答が得られない場合に発生します。

DNS ルックアップのタイムアウトを早めることで、オペレーティング システム レベルでこの問題を解決できます。たとえば、Linuxでは、デフォルトではなく 2 秒で DNS ルックアップをタイムアウトにするようにoptions timeout:2追加できます。/etc/resolv.confWindows では、レジストリ設定を編集する必要があります。

または、名前解決にスレッドを使用して、プログラムでこれを解決することもできます。指定したタイムアウトでスレッドが返されない場合は、名前解決でUnknownHostException.

3 番目のオプションは、Google が 8.8.8.8 および 4.4.4.4 で維持しているものなど、別のより動作の良い DNS サーバーを使用することです。

于 2013-05-17T09:50:00.060 に答える