>
> {IOException: Socket Closed 에 대한 질문}
> {Young Kim(ykim), ykim@fasttide.com}
>
> WebLogic 4.5.1 사용중 error 가 한번 나면 계속 다음과 같이 Logging 을 계속하더군요.
> 상황은 Browser 에서 첫번째 Request Processing 하고, response 가 오기전에, 
> 또다른 Request 를 하면 아래와 같은 Exception 이 발생하던군요.
> Code 는 JSP 를 이용한 Servlet,EJB, Oracle Access application 입니다.
> 자료가 많아서 적당한 Q&A 를 찾기가 어렵군요. 조언 부탁합니다.
> ------------------
> Sat Mar 17 19:25:04 GMT 2001:<E> <ServletContext-Servlets> exception raised on '/jsp/shared/ErrorPage.jsp'
> Sat Mar 17 19:25:05 GMT 2001:<E> <ServletContext-Servlets> java.io.IOException: Socket Closed
> 	at weblogic.security.SSL.SSLSocket.sendRecord(SSLSocket.java, Compiled Code)
> 	at java.lang.Exception.<init>(Exception.java, Compiled Code)
> 	at java.io.IOException.<init>(IOException.java, Compiled Code)
> 	at weblogic.security.SSL.SSLSocket.sendRecord(SSLSocket.java, Compiled Code)
> 	at weblogic.security.SSL.SSLSocket.sendData(SSLSocket.java, Compiled Code)
> 	at weblogic.security.SSL.SSLSocketOutputStream.write(SSLSocketOutputStream.java, Compiled Code)
> 	at weblogic.servlet.internal.ServletOutputStreamImpl.flush(ServletOutputStreamImpl.java, Compiled Code)
> 	at weblogic.servlet.internal.ServletOutputStreamImpl.flushWithCheck(ServletOutputStreamImpl.java, Compiled Code)
> 	at weblogic.servlet.internal.ServletOutputStreamImpl.print(ServletOutputStreamImpl.java, Compiled Code)
> 	at javax.servlet.ServletOutputStream.println(ServletOutputStream.java, Compiled Code)
> 	at weblogic.servlet.jsp.JspWriterImpl.println(JspWriterImpl.java, Compiled Code)
> 	at com.fasttide.utils.servlet.MenuOptions.formatLevel1MenuItem(MenuOptions.java, Compiled Code)
> 	at com.fasttide.utils.servlet.MenuOptions.buildMainMenuItems(MenuOptions.java, Compiled Code)
> 	at com.fasttide.utils.servlet.MenuOptions.displayMenuOptions(MenuOptions.java, Compiled Code)
> 	at com._jsp._shared._ErrorPage._jspService(_ErrorPage.java, Compiled Code)
> ----

처리한 결과를 브라우져로 보낼 때 해당 OutputStream.flush() 시에 발생하는
IOException 은 대부분의 "어플리케이션서버"는 그 상황을 로깅합니다.
이러한 현상은 브라우져에서 호출한 후 서버측에서 그 결과를 내려보내주기 전에
"stop/forward/back"등의 버튼을 누른다거나, 혹은 응답시간이 늦어지니 다른 사이트로
가버렸거나, 브라우져를 닫아 버렸을 때 발생합니다.

따라서, "Warning 성 에러"로 취급하시면 됩니다.

이런 현상은 비단 BEA WebLogic 에서만 나타나는 현상은 아닙니다. Tomcat 에서도
나타나며, IBM Websphere 에서도 나타납니다.

Servlet 으로 개발할 경우, 대부분 이러한 현상에 대해 handling 이 가능합니다.
out.println()/out.flush()/out.close() 시에 발생하게 되니까 개발자의 코드에서 
catch 해 내어 "무시"케 하거나 혹은 "로깅"을 할 수 있는 거지요..
또한, RequestDispatcher 의 forward() 할 때도 발생할 수 있습니다.
마찬가지로 개발자의 어플리케이션 코드에서 catch 해 낼 수가 있고, 이 상황을
handling 할 수가 있습니다.

그러나, JSP의 경우는 얘기가 다릅니다.
JSP 코드는 자동으로 Servlet 으로 변경되어 엔진이 만든 Java JspServlet 코드로 
생산되고, 이 때, 위와 같은 상황이 발생했을 때, 그 자동으로 만들어진 코드에서 "무시"케
할까? 혹은 "에러"로 로깅을 할까?를 엔진마다 "선택"할 수 밖에 없는데, 만약 당신이 
엔진을 개발하는 사람이라면 어느 쪽을 택하겠습니까? 당연히 그 상황을 로그로 남기도록
했겠죠..

그래서, 유독 JSP에서만 그와 같은 에러가 로그에 남게 됩니다.

IBM WebSphere 의 경우는 "IOException: native write error: return code : -1",
Tomcat 의 경우는 "IOException: Connection reset by peer" 등과 유사한 에러가
남게 됩니다.


질문중에 하나를 확인할 것이 있습니다. "계속 다음과 같이 Logging 을 계속하더군요"
라는 것은 한번만 위와 같은 상황을 만들어 주면, 동일한 에러로그가 recursive 하게
무한 Loop 을 돌며 계속적으로 남게 되나요? 
이 경우라면, IT-PLUS 나 한국BEA 에게 그 상황을 설명하여 버그를 fix 하거나
해결법을 찾아 보세요....(그렇지 않을 것으로 추측합니다.)

통상 이런 버그는 "일단 에러가 생기면, 그 내용을 브라우져에게 알려주려고 하고, 
이는 브라우져가 닫혔으니 다시 동일한 에러를 내고, 다시 또 브라우져에게 알려주려고
하고.... " 이렇게 반복적인 루틴을 타기 때문에 발생합니다.

PS: "그렇기 때문에, Servlet으로 개발하시는 개발자는 이러한 부분에 대해 명시적인 처리를
    반드시 하셔야 합니다." 그렇지 않으면, JDF 에서 제가 실수한 것과 같은 동일한
    문제에 직면하실 수 있습니다.

    "Re: JDF의 버그 인정합니다"
     http://www.javaservice.net/~java/bbs/read.cgi?m=jdf&b=fw_qna&c=r_p&n=984369638


-------------------------------------------------------  
  본 문서는 자유롭게 배포/복사 할 수 있으나 반드시
  이 문서의 저자에 대한 언급을 삭제하시면 안됩니다
================================================
  자바서비스넷 이원영
  E-mail: javaservice@hanmail.net
  PCS:019-310-7324
================================================
Posted by 큰바우
: