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; }