java.io.IOException: Stream closed 異常的原因和處理

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章