2012-01-08 3 views
1

私はこのようjava.net.URLConnectionのタイムアウトを設定しようとしている `に設定されたよりも多くのです:タイムアウトは、私がjava.net.URLConnection`

URL url = new URL("http://google.com"); 
URLConnection con = url.openConnection(); 
con.setConnectTimeout(2000); 
con.setReadTimeout(2000); 
InputStream in = con.getInputStream(); 
doc = new Tidy().parseDOM(in, null); 
XPath xpath = XPathFactory.newInstance().newXPath(); 
XPathExpression expr = xpath.compile("//td//span"); 
Node form = (Node) expr.evaluate(doc, XPathConstants.NODE); 

の問題は、私は(2000年に2秒タイムアウトを設定しながら、 )それはタイムアウトの例外をスローするまで、それ以上待機します(例えば、自分で数えると20秒)。

何が問題ですか?
どのように私は設定した値で正確に動作するようにタイムアウトを設定できますか?

答えて

1

readTimeOutは、Sunの(Oracleの)実装では正しく動作しません。これはさえJavaDocsに記載されている:

この方法のいくつかの非標準の実装では、指定された タイムアウトを無視します。読み取りタイムアウトセットを確認するには、getReadTimeout()を呼び出してください。

スレッドやタイマーを使用してタイムアウトをシミュレートできます。接続を子スレッドに渡し、そのスレッドに、タイムアウトの期限が切れた後にdisconnectまたは類似のものを呼び出すように依頼します。

+0

こんにちは、ありがとうございます。しかし、Sunの実装は非標準ですか? – RYN

+0

技術的に言えば、SunのJavaはJava仕様の「リファレンス実装」です。 TCKに合格したので、それが標準実装であると言うのは安全です。 JavaDocの文章はあいまいだと思います。 「Javaの実装では、このメソッドをノーオペレーションとして実装することが許可されている」などのようなものだったはずです。ところで、入力ストリームから何かを読み込んでいますか?さもなければ、なぜタイムアウトしなければならないのですか?この動作を示すより完全なブロックコードを投稿できますか? – Behrang

+0

こんにちは、ありがとう、私はいくつかのコード行を追加しました。 – RYN