- - PR -
URLConnectionを使用したServletとの通信
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-08-05 19:43
お世話になります。
javaのスタンドアロンアプリ(下記ソース)の中から、URLConnectionを使って Servletとデータ授受をおこなっています。 ここで、クライアント側にコネクションタイムアウトを持たせたいと思い、 システムプロパティに「sun.net.client.defaultReadTimeout」を設定しました。 (参項URL:http://www.ne.senshu-u.ac.jp/lectures/2002/ns/OOP/j2sdk/docs/ja/guide/net/properties.html) そして、Servletと実際に通信を行い、Servletコードの中にブレイクポイントを 置きデバッグし、暫く一時停止させることで、クライアント側でタイムアウトを 発生させようとしました。そして、実際にクライアント側の 「InputStream is = con.getInputStream()」の部分で、 「java.net.SocketTimeoutException: Read timed out」が発生し、タイムアウト を発生させることができました。 しかし、なぜかServlet側にもう一度リクエストがやってくる(doPostがコールさ れる)のです。 結果的に、doPostは2度呼ばれてしまいました。 タイムアウトを設定しなければ、このような現象は発生しません。 この現象に心当たりがおありな方がいらっしゃいましたら、何か情報を頂け ませんでしょうか? 環境 JDK:JDK1.4.2_05 OS:Windows2000 サーブレットコンテナ:Weblogic8.1sp4 −−−−−−クライアント側コード−−−−−− public class TestClient { public static void main(String[] args) throws Exception { String URL_STR = "http://localhost:7001/TestServlet"; //タイムアウト設定 //System.setProperty("sun.net.client.defaultConnectTimeout","10000"); System.setProperty("sun.net.client.defaultReadTimeout","10000"); URL serverURL = new URL(URL_STR); // サーバとの接続を行う URLConnection con = serverURL.openConnection(); con.setDoOutput(true); con.setUseCaches(false); con.setRequestProperty("CONTENT_TYPE", "application/octet-stream"); String data="おくります"; //送信 ObjectOutputStream oos = new ObjectOutputStream(con.getOutputStream()); oos.writeObject(data); oos.close(); //受け取り InputStream is = con.getInputStream(); ObjectInputStream ois = new ObjectInputStream(is); String ret=(String) ois.readObject(); System.out.println(ret); ois.close(); } } −−−−−−Servlet側コード−−−−−− public class TestServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //クライアントから受信 ServletInputStream sis = request.getInputStream(); ObjectInputStream ois = new ObjectInputStream(sis); String str = (String) ois.readObject(); //シスアウト System.out.println(str); ois.close(); sis.close(); //クライアントへの返信 ServletOutputStream sos = response.getOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(sos); String ret = "もどします"; oos.writeObject(ret); oos.close(); sos.close(); } catch (Exception e) { e.printStackTrace(); } } } [ メッセージ編集済み 編集者: yattu 編集日時 2005-08-05 19:45 ] [ メッセージ編集済み 編集者: yattu 編集日時 2005-08-05 19:47 ] |
|
投稿日時: 2005-08-06 01:40
weblogic6 + apache(mod_wl)を昔使ってた時は
mod_wlの設定なのか、タイムアウトした場合、 自動的にフェイルオーバー(というのか怪しい) みたいなのが働いて再接続に行くような事象 がありました。 ただ、環境を見ると、weblogicオンリーなので どうなのかなぁという感じです。 サポート使えるなら、素直に窓口に聞いてしまった 方が手っ取り早い気がします。 |
|
投稿日時: 2005-08-06 02:12
HttpURLConnection クラスがリトライすることはないと思います。(未確認)
プラグインに関連するなら、このあたり? http://edocs.beasys.co.jp/e-docs/wls/docs81/plugins/plugin_params.html#1154541 ぽちさんのおっしゃるとおり、WLS の挙動に関する話ならサポートに問い合わせるのが無難ですね。 WLS 以外へ接続してもリトライするようであればクライアント側の問題でしょうか。 |
|
投稿日時: 2005-08-08 17:38
皆様、ご助言ありがとうございます。
ご助言を元に、tomcat、IIS(aspxに接続)などでためしていましたところ、同じ 現象が発生しました。 従いまして、クライアント側の問題ということになりそうです。 引き続き調査してみます。 |
1