1

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>
4

1 に答える 1

2

いくつか確認してください

  1. 使用終了後は、必ずクライアントソケットを閉じてください。
  2. ソケットを作成するときは、適切なタイムアウトを指定してください。
于 2011-09-05T13:04:38.320 に答える