Соединение Java Socket, инициированное через веб-приложение, открывается при перезагрузке сервера - PullRequest
1 голос
/ 05 сентября 2011

У меня есть веб-приложение, работающее на 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>

1 Ответ

2 голосов
/ 05 сентября 2011

Пожалуйста, проверьте пару вещей

  1. Пожалуйста, убедитесь, что вы закрыли клиентский сокет после того, как вы закончили его использовать.
  2. Когда вы создаете сокет, укажите правильный тайм-аут.
...