Windows Server 2003 にインストールされた Tomcat 6 で Web アプリケーションを実行しています。このアプリケーションは、別のサーバーでソケット接続を開き、データを取得します。このアプリケーションは何ヶ月も機能しています。しかし、何らかの理由で 2 回、Web アプリケーションが動作を停止しました。どちらの場合も、netstat コマンドを (-ano を使用して) 実行すると、Web アプリがソケット接続を介して接続しているポートで (TIME_WAIT 状態で) 約 4.000 の tcp 接続が示されました。
奇妙なことはここから始まります。Tomcat を停止します。しばらくすると、これらの接続が切断されます (netstat を再度実行します)。Tomcat を再起動すると、これらの接続はすべて TIME_WAIT 状態に戻ります!!!
これらの接続が再開される理由はわかりません。私が見逃しているのは非常に明白なものかもしれません。何か案は?
ありがとうございました。
編集:
ソケット管理を行うコードは次のとおりです。
public void openSocketConnection() throws Exception {
socket = createSingleSocket();
socket.setSoTimeout(5000);
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8")), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
}
/**
* Closes socket and output input streams.
*/
public void closeSocketConnection() throws IOException {
socket.close();
out.close();
in.close();
}
/**
* Writes the input to the socket and returns the output response
*
* @param input
* a String to write on the socket
* @return output a String that the socket returns
* @throws Exception
*/
public String writeReadSocket(String input) throws Exception {
openSocketConnection();
out.println(input);
logger.debug("Socket Input:" + input);
String output = in.readLine();
logger.debug("Socket output:" + output);
closeSocketConnection();
return output;
}
/**
* Method overiden by Spring. We use the method injection technique, so that we have a new socket instance in every call to openSocketConnection()
* method
*/
public abstract Socket createSingleSocket();
呼び出されるメソッドは writeReadSocket です。
最後のメソッド (createSingleSocket) は spring によって使用されるため、openConnection() メソッドを呼び出すたびに新しい Socket インスタンスを作成できます (ちなみに、リクエストごとに新しい Socket を作成することが正しいかどうかはわかりません)。Spring 構成ファイルには、次のものがあります。
<!-- prototype scope is used to instantiate a new socket instance in every createSingleSocket() method call. -->
<bean id="socket" class="java.net.Socket" scope="prototype">
<constructor-arg type="String" value="${socket.url}"/>
<constructor-arg type="int" value="${socket.port}"/>
</bean>
<bean id="socketConnector" class="gr.diassa.dsjsonrpcsuite.socket.SocketConnector">
<lookup-method name="createSingleSocket" bean="socket"/>
</bean>