Exception 처리 방법 중 한가지.. 실예
Programming/Java 2007. 4. 18. 15:03 |제목 : [질문]2번이상 호출된 servlet 누가 좀 말려줘요.... 글쓴이: 박상현(linuzer) 2001/03/09 09:48:04 조회수:536 줄수:32 |
JDF에서 제시하는 데로 Entity bean만들고 DBWrapper만들고 ConnectionResource만들어서 주소검색하는 servlet을 만들어 봤는데요.. (물론 JDF에서 제공하는 servlet을 일부수정한 수준임) 주소를 넣고 submit을 한번만 누르면 정상적으로 실행이 됩니다. 그런데 검색이 끝나기도 전에 submit을 2번이상 누르게 되면 무지막지한 Connection by reset by peer, IO Exception을 내면서 log파일에는 수백MBytes의 에러로그가 쌓이고 급기야 out of memory가 되면서 전체 시스템의 수행속도가 급격하게 떨어집니다. 그리고는 제어가 넘어오지 않으므로 해서 다른 기능은 사용할 수 없게 됩니다. 그래서 제가 이것을 해결하려고 아래에 적어둔 일을 해보았는데 전부 실패 했습니다. 아무래도 servlet에 한번 진입하면 통제가 불가능한것 같아요.... 1. .jsp파일에서 javascript를 이용하여 플래그 셋팅후 넘어가지 못하게 함 2. servlet파일을 SingleThreadModel로 implements 3. 해당 method에서 synchronized를 걸어줌 4. service() method를 overriding해서 class 변수를 선언후 셋팅하여 thread확인후 이후에 들어오는 thread를 stop시킴 5. printJspPage()에 Exception체크 6. 기타 등등 을 해보았는데 도무지 어떻게 해야 할지 막막하네요.. 제가 궁금한것은 고의적이던, 실수든 submit버튼을 2번이상 눌러서 같은 servlet에 계속진입함으로서 서버가 IO error를 무한적으로 내면서 급기야 out of memory내면서 죽어버리는 문제를 해결하고 싶습니다. 일단은 이러한 문제가 발생하지 않도록 하는 방법과 최소한 한번만 에러를 발생시키고 전체적으로 영향을 주지 않게 하는 방법을 찾고 있습니다. 귀찮게 하고 싶지 않아서 초보 허접이가 근 1주일을 갖는방법(?)을 동원하여 해결해보려 했는데 더이상은 제가 해볼 수 있는 방법이 없습니다. 그리고 이렇게 되면 2인 이상이 동시에 이것을 사용할 수 없는건가요? (2인 이상이 거의 유사한 시간에 servlet에 진입할 수 있잖아요....그럼 위와 같은 에러가 발생하면서 서버가 죽게 되는것은 아닌가요?) 감사합니다. |
제목 : Re: [질문]2번이상 호출된 servlet 누가 좀 말려줘요.... 글쓴이: 신석영(dogfly) 2001/03/10 19:50:19 조회수:586 줄수:31 |
글쎄요 저도 jdf를 사용하여 여러프로그램들을 만들어봤지만 submit 버튼을 연속해서 눌렀다고해서 그런상황이 발생된 적은 없었습니다. servlet을 일부 수정하였다고 하셨고.. "log파일에는 수백MBytes의 에러로그가 쌓이고 급기야 out of memory.." 위의 상황으로 봐서는 submit 버튼이 두번 눌리웠을때(Exception 상황에) 로직이 무한루프를 타지 않나 하는 생각이 듭니다. 소스를 올려놓지 않으셨으니 정확한 답변을 드릴순 없지만. 그냥 내 맘대로 상상해 보건데 Exception 시에 다음과 같이 코딩하셨겠죠? catch(Exception e) { Message msg = new MessageStore("V007"); printMessagePage(req, res, msg, e); return; <<--- 이부분은 꼭 들어가야 합니다. } 혹시 printMessagePage 메소드가 또다른 메소드를 호출하고.. 하는 식으로 되어서 무한루프가 도는것은 아닌지.. 소스코드를 꼭 첨부해 주세요... 그래야 정확한 답변을 드리지요.. (ConnectionResource 를 포함한 모든 소스코드를 서블릿 코드는 물론.. 서블릿이 상속받는 슈퍼클래스 까지 몽땅.. ) from 신석영 dogfly@hanmail.net dogfly@uno-systems.com Mobile:017-763-6500 |
제목 : [질문 추가] 소스는 요.. 글쓴이: 박상현(linuzer) 2001/03/11 12:15:10 조회수:344 줄수:24 |
답변 감사합니다. 소스는 javaservice.net/~java/jdf/pbf/src/gov/mpb/sm/ZipCodeServlet.java을 이용했습니다.(거의 바뀐것 없습니다.) entity bean은 같은 디렉토리의 smt_200.java이고, Wrapper는 smt_200DbWrap.java을 사용했습니다. 그래서 소스를 올리지 않았습니다.(거의 변한게 없으니 깐요...죄송) 석영님이 예상하신 그런 문제가 발생합니다. 버튼이 두번이상 눌리게 되면 두번째 이상의 것은 service()에서 체크해서 return을 시킬려고 했거든요(맞는 생각인지 모름)... 그런데 첫번째 것이 실행되고 printJspPage()에서 와서 문제가 생기는것 같아요 (실행도중 어디 선가 return시키면 HttpServletResponse가 깨져서 제어가 넘어가지 않고 무한 루프에 빠지는것 같습니다). log파일을 봐도 query문장까지 찍히는데 JSP Call error(?)가 찍히고 printMessagePage()에서 반복적으로 메세지가 발생합니다 (요놈이 log파일을 거의 점유하지요) 소스를 보니 지적하신 부분에 return이 없네요.... 이게 왜 무한 루프에 빠지게 하는건가요? (저는 이원영씨 작품이라 소스에는 문제가 없을것이라 생각했습니다) 그럼.. 미리 답변 감사합니다. |
제목 : Re: "return"은 꼭 들어가야 합니다. 글쓴이: 이원영(javaservice) 2001/03/11 21:29:12 조회수:806 줄수:23 |
엔지니어는 프로그래밍 언어로 대화합니다. 관련 에러로그 전부와 관련 소스 전부를 올리세요... 뭐든 가급적 추측하지 마시고, 있는 그대로 문제현상을 설명해 보세요... PS:신석영님이 지적한 바와 같이 catch(Exception e){} 절에서 "retrun" 문은 반드시 들어가야 합니다. ZipCodeServlet.java 에서와 같이 말입니다. 만약 이 부분이 들어가질 않으면, printMessagePage()나 printPopupMessagePage() 에서 PrintWriter out = res.getWriter() 가 불려져서 output stream 에 내용이 buffering 됩니다. 만약, return 문이 기술되어 있지 않으면, 로직이 밑으로 흘러 printJspPage()를 만나 내부적으로 JSP로의 forward 가 일어나게 되고, 십중 팔구는 IllegalStateException 을 발생하게 될 겁니다. 이때 이 Error 를 처리하기 위해 다시 printErrorPage()를 부르게되고 내부적으로 IllegalStateException 을 또다시 발생하게 되니 결국 recurrsive looping 을 무한하게 돌게 될 겁니다. IBM WebSphere 의 경우는 이같은 recurrsive logic 를 잡아내어 recurrsive error 라고 보여주지만, 다른 서블렛엔진의 경우는 무한루프를 돌면서 Stackover flow 를 내거나 OutOfMemoryError 를 낼 수도 있습니다. ================================================ 자바서비스넷 이원영 E-mail: javaservice@hanmail.net PCS:019-310-7324 ================================================ |
제목 : [재 질문]다시한번 봐주세요..(소스첨부) 글쓴이: 박상현(linuzer) 2001/03/12 10:26:13 조회수:712 줄수:130 |
자꾸 귀찮게 해서 정말 죄송합니다. 소스 화일도 첨부하니 다시한번 봐주세요... return을 넣어도 계속 에러가 뜹니다. log파일에 있는 몇가지는 제가 확인하기 위해서 집어 넣은것 입니다. 환경은 win98+tomcat3.2+oracle8i입니다. 그리고 ZipCodeServlet.java중 searchByKeyword()만 테스트 중입니다. 감사합니다..... =====java console에 뜨는 내용(첫줄 이외는 반복적으로 발생하는 부분임)======== flag(2) : running so I'll go back 2001-03-12 11:28:39 - Ctx( /psh ): IOException in: R( /psh + /kict/address.jsp null) Connection reset by peer: socket write error 2001-03-12 11:28:39 - Ctx( /psh ): IOException in: R( /psh + /kict/message.jsp null) Connection reset by peer: socket write error 2001-03-12 11:28:39 - Ctx( /psh ): IOException in: R( /psh + /kict/message.jsp null) Connection reset by peer: socket write error 2001-03-12 11:28:39 - Ctx( /psh ): IOException in: R( /psh + /kict/message.jsp null) Connection reset by peer: socket write error ==========log파일 내용(submit버튼을 연속 2번 누른경우) =========== D111121 thread name(1) is : Thread-10 D111121 flag(1) before service : sleeping D111121 flag(1) after service : running D111121 thread name(2) is : Thread-9 D111121 flag(2) before service : running D111121 flag(2) in if_check(I'll go back) : running D111121 new line========================================== D111121 dead thread name(2) is : Thread-9 S111130 [ZipCodeServlet:1122806] /psh/servlet/ZipCodeServlet:127.0.0.1(127.0.0.1):calling D111130 flag(2) at performTask() : running D111130 flag(2) before searchByKeyword() : running Q111136 [ZipCodeDbWrap:5841268] SELECT distinct addr1 FROM ZipCode :elapsed=3630 Q111136 [ZipCodeDbWrap:5841268] SELECT zipcd, addr1, addr2, addr3 FROM ZipCode WHERE addr1 like '부평4동%' or addr2 like '부평4동%' or addr3 like '부평4동%':elapsed=0 D111136 flag(2) after searchByKeyword() : sleeping S111136 JSP Call Error: ZipCodeServlet Request URI: /psh/kict/address.jsp User Location : 127.0.0.1(127.0.0.1) java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStream.socketWrite(Native Method) at java.net.SocketOutputStream.write(SocketOutputStream.java:83) at org.apache.tomcat.service.http.HttpResponseAdapter.endHeaders(HttpResponseAdapter.java:124) at org.apache.tomcat.core.BufferedServletOutputStream.sendHeaders(BufferedServletOutputStream.java:126) at org.apache.tomcat.core.BufferedServletOutputStream.reallyFlush(BufferedServletOutputStream.java:236) at org.apache.tomcat.core.ResponseImpl.finish(ResponseImpl.java:206) at org.apache.tomcat.facade.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:215) at com.lgeds.jdf.servlet.JDFBaseServlet.printJspPage(JDFBaseServlet.java:236) at ZipCodeServlet.selectByKeyword(ZipCodeServlet.java:163) at ZipCodeServlet.performTask(ZipCodeServlet.java:103) at PBaseServlet.performPreTask(PBaseServlet.java:45) at com.lgeds.jdf.servlet.JDFBaseServlet.performBasePreTask(JDFBaseServlet.java:170) at com.lgeds.jdf.servlet.JDFBaseServlet.doPost(JDFBaseServlet.java:140) at ZipCodeServlet.service(ZipCodeServlet.java:91) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404) at org.apache.tomcat.core.Handler.service(Handler.java:286) at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372) at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:797) at org.apache.tomcat.core.ContextManager.service(ContextManager.java:743) at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:210) at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416) at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:498) at java.lang.Thread.run(Thread.java:484) S111137 JSP Call Error: ZipCodeServlet Request URI: /psh/kict/message.jsp User Location : 127.0.0.1(127.0.0.1) java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStream.socketWrite(Native Method) at java.net.SocketOutputStream.write(SocketOutputStream.java:83) at org.apache.tomcat.service.http.HttpResponseAdapter.endHeaders(HttpResponseAdapter.java:124) at org.apache.tomcat.core.BufferedServletOutputStream.sendHeaders(BufferedServletOutputStream.java:126) at org.apache.tomcat.core.BufferedServletOutputStream.reallyFlush(BufferedServletOutputStream.java:236) at org.apache.tomcat.core.ResponseImpl.finish(ResponseImpl.java:206) at org.apache.tomcat.facade.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:215) at com.lgeds.jdf.servlet.JDFBaseServlet.printJspPage(JDFBaseServlet.java:236) at PBaseServlet.printMessagePage(PBaseServlet.java:91) at com.lgeds.jdf.servlet.JDFBaseServlet.printMessagePage(JDFBaseServlet.java:319) at com.lgeds.jdf.servlet.JDFBaseServlet.printJspPage(JDFBaseServlet.java:269) at ZipCodeServlet.selectByKeyword(ZipCodeServlet.java:163) at ZipCodeServlet.performTask(ZipCodeServlet.java:103) at PBaseServlet.performPreTask(PBaseServlet.java:45) at com.lgeds.jdf.servlet.JDFBaseServlet.performBasePreTask(JDFBaseServlet.java:170) at com.lgeds.jdf.servlet.JDFBaseServlet.doPost(JDFBaseServlet.java:140) at ZipCodeServlet.service(ZipCodeServlet.java:91) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404) at org.apache.tomcat.core.Handler.service(Handler.java:286) at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372) at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:797) at org.apache.tomcat.core.ContextManager.service(ContextManager.java:743) at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:210) at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416) at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:498) at java.lang.Thread.run(Thread.java:484) S111137 JSP Call Error: ZipCodeServlet <======이하 반복적으로 발생하는 에러메세지................ Request URI: /psh/kict/message.jsp User Location : 127.0.0.1(127.0.0.1) java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStream.socketWrite(Native Method) at java.net.SocketOutputStream.write(SocketOutputStream.java:83) at org.apache.tomcat.service.http.HttpResponseAdapter.endHeaders(HttpResponseAdapter.java:124) at org.apache.tomcat.core.BufferedServletOutputStream.sendHeaders(BufferedServletOutputStream.java:126) at org.apache.tomcat.core.BufferedServletOutputStream.reallyFlush(BufferedServletOutputStream.java:236) at org.apache.tomcat.core.ResponseImpl.finish(ResponseImpl.java:206) at org.apache.tomcat.facade.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:215) at com.lgeds.jdf.servlet.JDFBaseServlet.printJspPage(JDFBaseServlet.java:236) at PBaseServlet.printMessagePage(PBaseServlet.java:91) at com.lgeds.jdf.servlet.JDFBaseServlet.printMessagePage(JDFBaseServlet.java:319) at com.lgeds.jdf.servlet.JDFBaseServlet.printJspPage(JDFBaseServlet.java:269) at PBaseServlet.printMessagePage(PBaseServlet.java:91) at com.lgeds.jdf.servlet.JDFBaseServlet.printMessagePage(JDFBaseServlet.java:319) at com.lgeds.jdf.servlet.JDFBaseServlet.printJspPage(JDFBaseServlet.java:269) at ZipCodeServlet.selectByKeyword(ZipCodeServlet.java:163) at ZipCodeServlet.performTask(ZipCodeServlet.java:103) at PBaseServlet.performPreTask(PBaseServlet.java:45) at com.lgeds.jdf.servlet.JDFBaseServlet.performBasePreTask(JDFBaseServlet.java:170) at com.lgeds.jdf.servlet.JDFBaseServlet.doPost(JDFBaseServlet.java:140) at ZipCodeServlet.service(ZipCodeServlet.java:91) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404) at org.apache.tomcat.core.Handler.service(Handler.java:286) at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372) at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:797) at org.apache.tomcat.core.ContextManager.service(ContextManager.java:743) at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:210) at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416) at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:498) at java.lang.Thread.run(Thread.java:484) address.jsp (6873 Bytes) ZipCode.java (783 Bytes) ZipCodeServlet.java (9124 Bytes) ZipCodeDbWrap.java (12105 Bytes) |
제목 : Re: JDF의 버그 인정합니다 글쓴이: 이원영(javaservice) 2001/03/12 13:00:38 조회수:7291 줄수:199 |
Tomcat 에서 "java.net.SocketException: Connection reset by peer: socket write error" 는 사실 정상적인 상황의 에러입니다. 사용자가 F5 키를 여러번 누르거나, 응답이 오기전에 다른 사이트로 이동하거나 할 경우, 서버측에서는 결과물인 HTML을 브라우져로 내려보내려 할 때, 이미 client 의 socket 이 닫혔으므로 위와 같은 IOException 을 발생하게 됩니다. 문제는 JDF에서 이 부분을 어떻게 처리 해야 겠느냐의 문제로 귀착되는데, 현재는 아래처럼 코딩이 되어 있습니다. http://javaservice.net/~java/jdf/src/com/lgeds/jdf/servlet/JDFBaseServlet.java ..... protected void printJspPage (HttpServletRequest req, HttpServletResponse res, String jspfile) { try { // IBM WebSphere 2.0.x //((com.sun.server.http.HttpServiceResponse) res).callPage(jspfile, req); // Servlet 2.1 RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(jspfile); dispatcher.forward(req, res); } catch (IllegalStateException e) { try{ java.io.PrintWriter out = res.getWriter(); java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); java.io.PrintWriter writer = new java.io.PrintWriter(bos); writer.println("JSP Call Error: " + this.getClass().getName() ); writer.println("Request URI: " + req.getRequestURI() ); String user = req.getRemoteUser(); if ( user != null ) writer.println("User : " + user ); writer.println("User Location : " + req.getRemoteHost() + "(" + req.getRemoteAddr() + ")"); e.printStackTrace(writer); writer.flush(); res.setContentType("text/html;charset=euc-kr"); out.println("<html><head><title>Errort</title></head><body bgcolor=white><xmp>"); out.println(bos.toString()); out.println("</xmp></body></html>"); out.close(); } catch(Exception ex){} } catch (Exception e) { java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); java.io.PrintWriter writer = new java.io.PrintWriter(bos); writer.println("JSP Call Error: " + this.getClass().getName() ); writer.println("Request URI: " + req.getRequestURI() ); String user = req.getRemoteUser(); if ( user != null ) writer.println("User : " + user ); writer.println("User Location : " + req.getRemoteHost() + "(" + req.getRemoteAddr() + ")"); e.printStackTrace(writer); writer.flush(); Logger.sys.println(bos.toString()); printMessagePage(req,res, bos.toString()); } } 즉 현재, dispatcher.forward(req, res); 시에 IOException 이 발생할 경우, 두번째 catch(Exception e){} block 에서 님이 보고 계시는 에러를 Loggrer.sys.println(...)을 통해 로깅하게 됩니다. 그런뒤 다시 printMessagePage(....) 가 불려지게 되고, 님께서는 PBaseServlet.java 를 만들어 사용하셨으나, 그 역할을 원래 하도록 한 PBF(Project Base Framework)의 PublicBaseServlet.java 의 printMessagePage(...)는 아래와 같이 코딩이 되어 있습니다. http://javaservice.net/~java/jdf/pbf/src/gov/mpb/pbf/PublicBaseServlet.java protected void printMessagePage(HttpServletRequest req, HttpServletResponse res, String user_msg, String debug_msg) { if ( user_msg == null ) user_msg = "message is null"; req.setAttribute("jdf_user_msg", user_msg); if ( debug_msg == null ) debug_msg = ""; else { try { com.lgeds.jdf.Config conf = new com.lgeds.jdf.Configuration(); boolean mode = conf.getBoolean("gov.mpb.pbf.jspDebugMessageMode"); if ( mode ) { Logger.debug.println(debug_msg); } } catch(Exception e){} } req.setAttribute("jdf_debug_msg", debug_msg); printJspPage(req, res, "/pbf/message.jsp"); } 사실 이 부분의 저의 실수이긴 한데, 여기서 다시 printJspPage() 가 불려지고, 이는 JDBBaseServlet.java 의 printJspPage()에서 다시 IOException 이 발생하여 recurrsive 하게 계속 무한 루프를 돌게 됩니다. 인정합니다. 잘못됐군요.... 이 현상이 IBM WebSphere 의 경우는 recurrsive error 를 smart 하게 잡아내어 계속적인 recurrsive loop 를 타지 않지만, tomcat 의 경우는 끝까지 돌게 되는 군요.... 해결책은 JDFBaseServlet 의 printJspPage(...)에서 IOException 을 가로채어 무시케 해야 할 듯 합니다. catch(IOException e){....} 절을 아래처럼 추가 해야 겠어요.... [com/lgeds/jdf/servlet/JDFBaseServlet.java] ..... protected void printJspPage (HttpServletRequest req, HttpServletResponse res, String jspfile) { try { // IBM WebSphere 2.0.x //((com.sun.server.http.HttpServiceResponse) res).callPage(jspfile, req); // Servlet 2.1 RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(jspfile); dispatcher.forward(req, res); } catch (IllegalStateException e) { try{ java.io.PrintWriter out = res.getWriter(); java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); java.io.PrintWriter writer = new java.io.PrintWriter(bos); writer.println("JSP Call Error: " + this.getClass().getName() ); writer.println("Request URI: " + req.getRequestURI() ); String user = req.getRemoteUser(); if ( user != null ) writer.println("User : " + user ); writer.println("User Location : " + req.getRemoteHost() + "(" + req.getRemoteAddr() + ")"); e.printStackTrace(writer); writer.flush(); res.setContentType("text/html;charset=euc-kr"); out.println("<html><head><title>Errort</title></head><body bgcolor=white><xmp>"); out.println(bos.toString()); out.println("</xmp></body></html>"); out.close(); } catch(Exception ex){} } catch (IOException e) { try{ java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); java.io.PrintWriter writer = new java.io.PrintWriter(bos); writer.println("JSP Call Error: " + this.getClass().getName() ); writer.println("Request URI: " + req.getRequestURI() ); String user = req.getRemoteUser(); if ( user != null ) writer.println("User : " + user ); writer.println("User Location : " + req.getRemoteHost() + "(" + req.getRemoteAddr() + ")"); //e.printStackTrace(writer); writer.println(e.toString() + ":(client may have terminated connection before server completed response)" ); writer.flush(); Logger.debug.println(bos.toString()); } catch(Exception ex){} } catch (Exception e) { java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); java.io.PrintWriter writer = new java.io.PrintWriter(bos); writer.println("JSP Call Error: " + this.getClass().getName() ); writer.println("Request URI: " + req.getRequestURI() ); String user = req.getRemoteUser(); if ( user != null ) writer.println("User : " + user ); writer.println("User Location : " + req.getRemoteHost() + "(" + req.getRemoteAddr() + ")"); e.printStackTrace(writer); writer.flush(); Logger.sys.println(bos.toString()); printMessagePage(req,res, bos.toString()); } } Logger.debug.pritln() 으로 찍히니 DEBUG 모드일 경우에만 로그에 남도록 했습니다. PS: > 그리고 이렇게 되면 2인 이상이 동시에 이것을 사용할 수 없는건가요? > (2인 이상이 거의 유사한 시간에 servlet에 진입할 수 있잖아요....그럼 위와 같은 > 에러가 발생하면서 서버가 죽게 되는것은 아닌가요?) 그렇지는 않습니다. 서로다른 사용자는 서로다른 Thread에 의해 동작하여 서로다른 client socket 을 갖고 있으므로 위에서 설명한 현상은 일어나지 않습니다. 브라우져에서 응답이 오기전에 브라우져를 닫거나 다른 곳으로 가버린 상황에서만 나타납니다. NOTE: 좋은 지적 감사합니다. 차기 버전에 반영토록 하겠습니다. 또한 해당 문제의 현상을 정확하게 파악하고 있는 신석영님에게도 감사합니다. ================================================ 자바서비스넷 이원영 E-mail: javaservice@hanmail.net PCS:019-310-7324 ================================================ |
제목 : [감사]답변 감사합니다. 글쓴이: 박상현(linuzer) 2001/03/12 15:53:29 조회수:316 줄수:5 |
답변 감사합니다. 역쉬...... 고수님들은 허접초보의 영원한 빽입니다요...(딸랑딸랑) |