2014-11-11 4 views
8

나는 단지 Server Events로 놀기 시작했고, 나는 이해하고 싶어하는 크롬 오류 메시지를 만난다. 나는 진짜 빨리 웹을 수색했다 그러나 나는 나가 무언가 중대하게 무언가를 할지도 모른다 짐작한다 그래서 나는 설명을 찾아 내지 않았다. 클라이언트 단순히 난에HTML5 Server 이벤트 및 Java Servlet을 사용할 때 net :: ERR_INCOMPLETE_CHUNKED_ENCODING을 방지하는 방법은 무엇입니까?

private Executor executor = Executors.newSingleThreadExecutor(); 

public void doGet(final HttpServletRequest request, final HttpServletResponse response) 
{ 
    final AsyncContext asynCtx = request.startAsync(request, response); 

    response.setHeader("Cache-Control", "no-cache"); 
    response.setContentType("text/event-stream"); 
    response.setCharacterEncoding("utf-8"); 

    executor.execute(() -> { 
    boolean run = true; 
    try 
    { 
     while (run) 
     { 
     final ServletResponse resp = asynCtx.getResponse(); 
     run = resp != null; 

     if (resp != null) 
     { 
      System.out.println("pushing a server event."); 
      final PrintWriter writer = asynCtx.getResponse().getWriter(); 
      writer.println("data: {time: " + System.currentTimeMillis() + "}\n"); 
      writer.flush(); 
     } 
     else 
     { 
      System.out.println("stopping beeper, no response object available anymore."); 
      break; // do not run anymore, we got no response 
     } 

     Thread.sleep(2000); 
     } 
    } 
    catch (final Exception e) 
    { 
     e.printStackTrace(); 
    } 
    }); 

} 

: 서버 측에

내가 더미 이벤트 작성자 작업을 요청을 받아 생성하는 간단한 서블릿을

$(document).ready(function() 
{ 

    var source = new EventSource("/events"); 
    source.onmessage = function (event) 
    { 
    console.log("received event: " + JSON.stringify(event)); 
    document.getElementById("eventContainer").innerHTML += event.data + "<br/>"; 
    }; 

    console.log("start to receive events...") 
}); 

내가 HTML 파일을로드 할 때 잘 작동하고 이벤트가 수신되어 콘솔에 기록됩니다. 그러나 초 30 후 나는 오류 메시지 :

[HttpOfLocalhost]/이벤트 순 GET :: ERR_INCOMPLETE_CHUNKED_ENCODING

이유는 무엇입니까?

요청이 죽게되고 즉시 새로 시작되므로 응용 프로그램이 죽지 않지만 콘솔의 오류 메시지는 좋지 않습니다. 내 개발자 콘솔의

스크린 샷 :

enter image description here

요청/resposne 세부 사항 :

enter image description here :

enter image description here

타이밍, 이것은 항상 30 초 후에 발생하는 것을 보여줍니다

감사!

답변

3

좋아, 그래서 나는 아직도 서서 일어나는 일을 가까이서 볼 수 없었습니다.

AsyncContext 개체는 setTimeout(...) 메서드를가집니다. Tomcat의 내 버전 (Tomcat이 내장 됨 8)의 기본값에 따라 값은 30,000ms (30 초)로 설정됩니다. 그게 내 크롬 콘솔에 net :: ERR_INCOMPLETE_CHUNKED_ENCODING 오류가 발생한 후 정확히 그 기간입니다.

Current Timeout is: 30000 ms 

그래서 그물 피하기 위해 : 보여

System.out.println("Current Timeout is: " + asynCtx.getTimeout() + " ms"); 

: ERR 메시지 누군가가 0으로 제한 시간을 설정할 수를하지만 이벤트 스레드보다 영원히 계속 실행 (

은 내가 사용 확인 운수 나쁘게). 다른 해결책은 AsyncListenerAsyncContext에 추가하고 메서드를 onTimeout() 메서드 내에서 호출하는 것입니다.이 초기화에 사용 된 반응 개폐

이 AsyncContext을 initialze 데 사용 된 요청 시작 하였다 비동기 동작을 완료 : 완전한() 메소드의 API의 문서에서

AsyncContext. 이 AsyncContext가 생성 된 이있는 ServletRequest에 등록 된 AsyncListener 유형의 모든 리스너는 oncomplete 메소드에서 호출됩니다.

내 청취자의 소스 코드 :

asynCtx.addListener(new AsyncListener() 
{ 
    @Override 
    public void onComplete(AsyncEvent asyncEvent) throws IOException 
    { 
    System.out.println("onComplete(...)"); 
    } 

    @Override 
    public void onTimeout(AsyncEvent asyncEvent) throws IOException 
    { 
    // this will close the request and the context gracefully 
    // and the net:ERR is gone. 
    asyncEvent.getAsyncContext().complete(); 
    System.out.println("onTimeout(...)"); 
    } 

    @Override 
    public void onError(AsyncEvent asyncEvent) throws IOException 
    { 
    System.out.println("onError(...)"); 
    } 

    @Override 
    public void onStartAsync(AsyncEvent asyncEvent) throws IOException 
    { 
    System.out.println("onStart(...)"); 
    } 
}); 

그래서 예, 그것은 지식으로 인해 부족이었다. 나는 이것이 누군가에게 도움이되기를 바랍니다.

+2

말해주십시오. 이 오류가 있지만 Asynk을 사용하지 않습니다. 나는 페이지에 가고 나는이 오류가있다. – Tsyklop

2

작은 "no operation"(noop) 청크를 보내 10 초마다 연결을 유지할 수 있습니다.