2

doPost メソッドでバイナリ ファイルのアップロードを読み取る Tomcat のサーブレットがあります。サーバー コードは次のように簡略化されます。

protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("Received post request");

    int read;
    byte[] buffer = new byte[10*1024];
    try {
        InputStream inputStream = req.getInputStream();
        while ((read = inputStream.read(buffer, 0, buffer.length)) != -1) {
            /* do stuff */
        }
        resp.setStatus(200);
    } catch (Exception e) {
        resp.setStatus(500);
    }
}

これをサーブレットに使用してファイルをアップロードするクライアント アプリケーションがあります。非常に頻繁に、私はjava.net.SocketTimeoutExceptionオンになっていますinputStream.read()

サーバー側の例外でこれをトリガーするテストクライアントアプリを作成したいと思います。

私は試した:

public static void triggerTimeOut() {
    HttpURLConnection urlConn = null;
    try {
        URL me = new URL("http://localhost:8080/uploadData");
        urlConn = (HttpURLConnection)me.openConnection();
        urlConn.setDoOutput(true);
        urlConn.setDoInput(true);

        OutputStreamWriter sw = new OutputStreamWriter(urlConn.getOutputStream());

        String[] data = new String[] {"line 1", "line 2"};
        System.out.println(urlConn.getReadTimeout());
        while(true) {
            sw.write(data[0]);
            sw.flush();
            System.out.println(data[0]);
            Thread.sleep(120000);
            // break;
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            System.out.println(urlConn.getResponseCode());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        };
    }
}

しかし、タイムアウトがトリガーされることはなく、サーバー ログでは、クライアント アプリを強制終了した後でも、「Received post request」を取得することさえできません。sleepコメントしてコメントを外すと、デバッグ行が出力されbreakます。

サーバーが読み取って SocketTimeoutException をスローできるようにするには、(Tomcat またはクライアントのいずれかで) どのような調整を行う必要がありますか? HTTP コネクタはconnectionTimeout="5000"server.xml で設定されます。デフォルトの 20000 よりも意図的に短く設定されています。

テスト目的でシナリオを再作成しようとしています。

4

0 に答える 0