我有一个在Tomcat 6上运行的Web应用程序,安装在Windows Server 2003上。此应用程序在不同的服务器上打开套接字连接以检索一些数据。这个应用程序已经工作了几个月。但由于某种原因,两次出现Web应用程序停止工作。在两次运行中,运行netstat命令(使用-ano)在Web应用程序通过套接字连接连接的端口上显示大约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();
调用的方法是writeReadSocket。
spring使用了最后一个方法(createSingleSocket),所以每次调用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 :(得分:2)
请检查几件事