2011-09-05 10 views
1

WindowsアプリケーションサーバーにインストールされているTomcat 6上で実行されているWebアプリケーションがあります。このアプリケーションは何ヶ月も働いています。しかし何らかの理由で2回発生すると、Webアプリケーションが動作しなくなりました。どちらの場合も、netstatコマンド(-anoを使用)を実行すると、Webアプリケーションがソケット接続を介して接続しているポートで、約4.000 tcp接続(TIME_WAIT状態)が示されました。WebアプリケーションからJavaソケット接続が開始され、サーバーが再起動すると再び開きます

奇妙なことはここから始まります:私はTomcatを止め、しばらくして接続が落ちる(netstatをやり直す)。私はtomcatを再起動し、これらの接続はすべてTIME_WAIT状態に戻ります!

私はこれらの接続が再開された理由を知りません。私が紛失していることは非常に明白なことかもしれません。何か案は?

ありがとうございます。

EDIT:

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> 
+0

使用しているクライアントソケット関連のコードを投稿できますか? – Santosh

答えて

2

物事

  1. のカップルを確認してくださいあなたがそれを使用して終了した後は、クライアントソケットを閉じていることを確認してください。
  2. ソケットを作成するときは、適切なタイムアウトを指定してください。
+0

1.どのように私はそれが閉じていることを確認することができますか分からない。 2.私はsetSoTimeout()メソッドを呼び出しています。それで十分ですか? – alex

+0

java.net.Socketクラスにclose()メソッドがあります。 SetSoTimeout()は、このソケットを介してクローズしないように要求されたものです(http://download.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#setSoTimeout(int)を参照してください) – Santosh

+1

setKeepAlive(false)を試してください。 http://drdobbs.com/java/184404250 – Santosh

関連する問題