2009-11-05 2 views
0

JSP 페이지 내에 Thread.sleep()을 1 시간 이상 작성했습니다. JSP는 WebLogic 서버 9.2에서 배포됩니다. 브라우저 시간 초과를 확인하려고하는데 페이지를 표시 할 수 없습니다. 오류가 발생했습니다.브라우저 시간 초과 및 페이지를 표시 할 수 없습니다.

아래의 설명서에 따르면 IE6의 기본 시간 초과는 60 초입니다. 그러나 위의 JSP를 테스트 중이 었는데 30 분이 지나도 시간 제한이나 페이지를 표시 할 수 없었습니다. 나는 이것을 실행하는 데 오랜 시간이 걸릴 수있는 요구 사항에 대해 사용자 경험을하고 있습니다. 감사.

http://support.microsoft.com/kb/181050

+0

KB 기사는 오해의 소지가 있습니다. TCP/IP CONNECT에 대한 시간 종료와 응답 내용의 실제 읽기가 별도로 있습니다. 더 짧은 시간 제한은 TCP/IP 연결입니다. – EricLaw

답변

0

귀하의 페이지가 열려있는 소켓을 떠나 더 많은 데이터를 기다리는 IE를 확신 (예 : 헤더 등) 데이터의 일부 금액을 반환 수 있습니다.

실제로 무슨 일이 일어나는지 보려면 IE로 Wireshark (또는 Fiddler)를 컴퓨터에서 실행 해보십시오. 서버의 80 번 포트로 텔넷하여 페이지를 수동으로 요청할 수도 있습니다 (GET /path/to/your.jsp HTTP/1.0 다음에 2 줄 바꿈 입력).

0

난 당신이 AJAX 기술을 사용하여 긴 동작 문제의 이런 종류의 문제를 해결할 필요가 있다고 생각합니다. 서버가 1 시간 이상 연결을 유지하도록 요구하는 것은 효율적인 결정이 아닙니다.

100 명이 넘는 사용자가 서버에 연결할 경우 어떻게됩니까?

간단한 AJAX 솔루션의 개념은 다음과 같이이다 :

  1. 당신이 자바 스크립트의 setTimeInterval를 사용하여 타이머를 시작().
  2. 타이머를 호출 할 때 URL을 작성하고 XmlHttpRequest를 사용하여 서버를 요청하십시오.
  3. 이 비동기 요청은 서버 측 백엔드 서비스의 진행을 트리거 (또는 요청)합니다.
  4. JS 타이머가 틱 할 때마다 서버 쪽에서 진행 상황 (또는 결과)에 응답하여 사용자에게 시각적 인 응답을 제공해야합니다.

나는 이것이 당신의 일을하는 더 좋은 방법이라고 생각합니다. 당신은이 메커니즘을 독자적으로 만들거나 GWT, DWR 심지어 ZK와 같은 기존 AJAX 프레임 워크를 사용하여이를 달성 할 수 있습니다.

0

브라우저가 호스트에 연결하지 못하면 일반적으로 "이 페이지를 표시 할 수 없습니다."라는 메시지가 나타납니다. 앞서 설명한 시나리오에서 브라우저는 연결을 관리하고 연결이 완료되거나 서버 쪽이 끊어 질 때까지 해당 연결을 열어 놓습니다.

브라우저의 기능을 테스트하려는 경우 네트워크에서 일부 트릭을 실행하여 연결에 실패해야합니다. 예를 들어, 서버에서 방화벽 포트 80을 보내면 패킷이 응답하지 않습니다. 브라우저는 응답을 기다리는 동안 소켓을 60 초 동안 열어 두어야합니다. 응답이 도착하지 않으면 "이 페이지를 표시 할 수 없습니다."라는 메시지가 표시됩니다.

+0

한 시간 후에 페이지를 표시 할 수 없습니다. 혼란 스럽기 때문에 왜 60 초가 지났지. –

+0

아마도 서버가 응답 헤더를 반환했기 때문에 클라이언트는 이제 응답 본문을 기다리고 있습니다. – BalusC

3

장기 실행 프로세스를 실행하고 제어하려는 경우 요청의 Thread 대신 자체적으로 Thread으로 실행하는 것이 좋습니다. 이 Thread에 대한 참조를 세션 범위에 저장하여 클라이언트가 동일한 세션을 사용하여 (현재 세션을 사용하여) 진보 된 요청을 사용하여 서버 측에 현재 진행 상황을 요청할 수 있습니다 (또한 자동으로 세션을 활성 상태로 유지하여 시간 초과가 발생하지 않도록합니다).).,

<servlet> 
    <servlet-name>runLongProcess</servlet-name> 
    <servlet-class>mypackage.RunLongProcessServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>runLongProcess</servlet-name> 
    <url-pattern>/runLongProcess</url-pattern> 
</servlet-mapping> 

을 그리고 여기에 약간의 샷 jQuery과 함께합니다 (JSP의 기본 예제 :

package mypackage; 

import java.io.IOException; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class RunLongProcessServlet extends HttpServlet { 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException 
    { 
     if ("XMLHttpRequest".equals(request.getHeader("x-requested-with"))) { 
      LongProcess longProcess = (LongProcess) request.getSession().getAttribute("longProcess"); 
      response.setContentType("application/json"); 
      response.getWriter().write(String.valueOf(longProcess.getProgress())); 
     } else { 
      request.getRequestDispatcher("runLongProcess.jsp").forward(request, response); 
     } 
    } 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException 
    { 
     LongProcess longProcess = new LongProcess(); 
     longProcess.setDaemon(true); 
     longProcess.start(); 
     request.getSession().setAttribute("longProcess", longProcess); 
     request.getRequestDispatcher("runLongProcess.jsp").forward(request, response); 
    } 

} 

class LongProcess extends Thread { 

    private int progress; 

    public void run() { 
     while (progress < 100) { 
      try { sleep(1000); } catch (InterruptedException ignore) {} 
      progress++; 
     } 
    } 

    public int getProgress() { 
     return progress; 
    } 

} 

다음과 같이 매핑됩니다 요식 :

는 다음과 같은 서블릿의 기본 예제 내가 추천하는 ajaxical JS 프레임 워크) :

<!doctype html> 
<html lang="en"> 
    <head> 
     <title>Show progress of long running process with help of Thread and Ajax.</title> 
     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
     <script type="text/javascript"> 
      $(document).ready(init); 

      function init() { 
       if (${not empty longProcess}) { 
        $.progress = 0; 
        checkProgress(); 
       } 
      } 

      function checkProgress() { 
       $.getJSON('runLongProcess', function(progress) { 
        $('#progress').text(progress); 
        $.progress = parseInt(progress); 
       }); 
       if ($.progress < 100) { 
        setTimeout(checkProgress, 1000); 
       } 
      } 
     </script> 
    </head> 
    <body> 
     <form action="runLongProcess" method="post"> 
      <p>Run long process: <input type="submit"></p> 
      <p>Current status: <span id="progress">0</span>%</p> 
     </form> 
    </body> 
</html> 

열기 그것을 http://localhost:8080/yourcontext/runLongProcess에 입력하고 버튼을 클릭하십시오.)

희망을, 이것은 정말, 정말 긴 실행중인 프로세스 인 경우

, 서버가 DDOS'ed을 받고 느끼지 않도록 오초 정도에 아약스 간격을 증가시켜 "효율"을 향상시킬 수 있습니다 이것은 도움이됩니다.

+0

위의 코드를 제공해 주셔서 감사합니다. 내 의도는 스레드를 테스트하는 것이 아니라 요청에 매우 오랜 시간이 걸리면 무엇이 시간인지를 확인하는 것입니다. 브라우저 또는 서버가 어떻게 작동하는지 확인하고 예외가 발생했는지 확인하고 싶습니다. –

+0

이 목적으로 요청 스레드를 남용하는 것은 나쁜 습관입니다. 작업은 "백그라운드 실행 스레드"에서 수행되어야합니다. ajaxical 요청은 세션을 활성 상태로 유지하여 (기본값) 30 분 후에 시간 초과되지 않도록 도와줍니다. – BalusC

0

답장을 보내 주셔서 감사합니다. 사용자가 더 오래 기다릴 수있는 요구 사항이 있습니다. WebLogic의 Work Manager를 사용하여 서버의 구성에 따라 병렬 요청 수를 제한하고 있습니다. 병렬 요청 수가 스레드의 최대 수보다 많으면 요청이 대기열에 배치됩니다. 링크에 지정된대로 60 초 후 브라우저가 시간 초과되는 경우 내 질문 - http://support.microsoft.com/kb/181050. 몇 가지 테스트를 수행했으며 페이지를 표시 할 수 없다는 것을 관찰 한 후 1 시간 후에 메시지가 표시됩니다. 또한 응답 헤더를 확인하고 응답 내용이나 응답 헤더가 반환되지 않았습니다. 따라서 서버가 우리의 시간을 측정하고 있거나 브라우저가 시간 초과되는지 확실하지 않습니다. 또한 IE6이 설명서에 따라 1 시간 후 또는 60 초 후에 시간 초과되는지 확인하고 싶습니다.

감사합니다.

+0

죄송하지만 브라우저에서 1 시간 검색어를 실행하는 것은 ** 잘못된 ** 일뿐입니다. 내가 http://stackoverflow.com/questions/1676199/work-managers-threads-constraint-and-page-cannot-be-displayed/1678440#1678440에 쓴 것처럼이 장기 실행 프로세스를 비동기 프로세스로 구현해야합니다. –

관련 문제