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 よりも意図的に短く設定されています。
テスト目的でシナリオを再作成しようとしています。