У меня есть веб-приложение, работающее на Tomcat 6, установленное на Windows Server 2003. Это приложение открывает сокетные соединения на другом сервере для получения некоторых данных.Это приложение работает в течение нескольких месяцев.Но в двух случаях по какой-то причине веб-приложение перестало работать.В обоих случаях команда netstat (с параметром -ano) показала около 4.000 tcp-соединений (в состоянии TIME_WAIT) на порту, который веб-приложение подключает через сокет-соединение.
Странная вещь начинается здесь: я останавливаюсь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();
Метод, который вызываетсяis writeReadSocket.
Последний метод (createSingleSocket) используется Spring, поэтому я могу иметь новый экземпляр Socket для каждого вызова метода openConnection () (кстати, я не уверен, правильно ли этоесть новое гнездо для каждого запроса).В конфигурационном файле 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>