java.io.IOException: Stream closed
多个线程索引同一个input stream,当某一个thread在执行完之后,把这个inputstream关闭了;而此时正在从这个input stream流中读取信息的线程就会抛出 java.io.IOException: Stream closed 异常。
终于找到这个异常的根源所在,原来是两个页面同时调用一个jsp,这个jsp中的内建对象
out在执行out.close()时发生的异常,也就是当某一个thread(对应一个jsp)在执行完之
后,把这个stream关闭了;而此时正在从这个stream中读取信息的另一个jsp就会抛出
java.io.IOException: Stream closed 异常。
修改前代码:
public Object sendData(String jsonStr) {
// 1. 指定WebService的命名空间和调用的方法名
SoapObject rpc = new SoapObject(NAMESPACE, methodName);
// 2. 设置调用方法的参数值,这一步是可选的,如果方法没有参数,可以省略这一步
rpc.addProperty("arg000", jsonStr);
// 3. 生成调用WebService方法的SOAP请求信息。
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.encodingStyle = "UTF-8";
envelope.bodyOut = rpc;
// envelope.setOutputSoapObject(rpc);
// 4.
// 创建HttpTransportSE对象。通过HttpTransportSE类的构造方法可以指定WebService的WSDL文档的URL
HttpTransportSE ht = new HttpTransportSE(URL);
ht.debug = true;
Object detail1 = null;
try {
// 5. 使用call方法调用WebService方法
ht.call(null, envelope);
// detail = (SoapObject) envelope.getResponse();
// 6. 使用getResponse方法获得WebService方法的返回结果
detail1 = envelope.getResponse();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return detail1;
}
修改后代码:
public Object sendData(String jsonStr) {
// 1. 指定WebService的命名空间和调用的方法名
SoapObject rpc = new SoapObject(NAMESPACE, methodName);
// 2. 设置调用方法的参数值,这一步是可选的,如果方法没有参数,可以省略这一步
rpc.addProperty("arg000", jsonStr);
// 3. 生成调用WebService方法的SOAP请求信息。
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.encodingStyle = "UTF-8";
envelope.bodyOut = rpc;
// envelope.setOutputSoapObject(rpc);
// 4.
// 创建HttpTransportSE对象。通过HttpTransportSE类的构造方法可以指定WebService的WSDL文档的URL
HttpTransportSE ht = new HttpTransportSE(URL);
ht.debug = true;
Object detail1 = null;
try {
// 5. 使用call方法调用WebService方法
ht.call(null, envelope);
// detail = (SoapObject) envelope.getResponse();
// 6. 使用getResponse方法获得WebService方法的返回结果
detail1 = envelope.getResponse();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(new java.util.Date() + "IOException, resend the data");
try {
// 5. 使用call方法调用WebService方法
ht.call(null, envelope);
// detail = (SoapObject) envelope.getResponse();
// 6. 使用getResponse方法获得WebService方法的返回结果
detail1 = envelope.getResponse();
} catch (IOException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
} catch (XmlPullParserException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return detail1;
}
转载于:https://blog.51cto.com/carlwu/1617275