我有一个在jboss 7.1.1 / java 1.7下运行的servlet应用程序,它将http请求发送到另一台服务器。大多数时候一切正常,但偶尔(每天一到几次)我们得到一个“Socket closed”例外。我一直试图找出可能导致这种情况的原因,但到目前为止我还没有成功。顺便说一句,当应用程序在旧版本的Jboss / Java下运行时,这种情况一直在发生,因此版本可能不那么相关。
以下是发生这种情况的方法的摘录:
。 。 。 。
try
{
HttpURLConnection conn = (HttpURLConnection) urlEndpoint.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");
conn.setRequestProperty("charset", "UTF-8");
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.write(env.getBytes("UTF-8"));
out.flush();
out.close();
InputStream iss = null;
conn.connect();
try
{
iss = conn.getInputStream(); // this is where the exception is caught
。 。 。 。 。
这就是异常的样子:
。 。 。 。 。
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:633)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:579)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1322)
。 。 。 。 。
我遇到了一些提到http连接正在保留的套接字池的帖子,但我不确定这是否以及如何帮助我解决我遇到的问题。
我现在已经用尽了所有的想法,如果有任何帮助,我将不胜感激。
答案 0 :(得分:1)
在执行任何I / O之前调用conn.connect()
会更有意义。之后做这件事没有任何意义。您无需关闭输出流。