- PR -

URLConnectionを使用したServletとの通信

1
投稿者投稿内容
yattu
会議室デビュー日: 2005/08/05
投稿数: 7
投稿日時: 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 ]
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-08-06 01:40
weblogic6 + apache(mod_wl)を昔使ってた時は
mod_wlの設定なのか、タイムアウトした場合、
自動的にフェイルオーバー(というのか怪しい)
みたいなのが働いて再接続に行くような事象
がありました。

ただ、環境を見ると、weblogicオンリーなので
どうなのかなぁという感じです。

サポート使えるなら、素直に窓口に聞いてしまった
方が手っ取り早い気がします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-08-06 02:12
HttpURLConnection クラスがリトライすることはないと思います。(未確認)
プラグインに関連するなら、このあたり?
http://edocs.beasys.co.jp/e-docs/wls/docs81/plugins/plugin_params.html#1154541
ぽちさんのおっしゃるとおり、WLS の挙動に関する話ならサポートに問い合わせるのが無難ですね。
WLS 以外へ接続してもリトライするようであればクライアント側の問題でしょうか。
yattu
会議室デビュー日: 2005/08/05
投稿数: 7
投稿日時: 2005-08-08 17:38
皆様、ご助言ありがとうございます。
ご助言を元に、tomcat、IIS(aspxに接続)などでためしていましたところ、同じ
現象が発生しました。
従いまして、クライアント側の問題ということになりそうです。
引き続き調査してみます。
1

スキルアップ/キャリアアップ(JOB@IT)