2013-11-01 3 views
1

누군가 내 데이터베이스에서 특정 필드를 변경할 때마다 이벤트를 내 보내는 영역이 있습니다. 이제 이벤트가 잠시 동안 발생하는 것 같습니다. 일정 기간 동안 유휴 시간이 지나면 열이 변경되면 더 이상 브로드 캐스트 메시지가 표시되지 않습니다.EventSource (SSE)가 아직 열려 있고 지속적으로 유지되는지 확인하는 방법은 무엇입니까?

나는 방화 광 가시지만, 연결이 여전히 열려 있는지 확인하는 방법에 대해서는 잘 모르겠습니다. Firebug를 보면 "closeed : 2, CONNECTING : 0, OPEN : 1, readyState : 0"이라고 표시되지만 이벤트 발생 여부 (방출, 표시)에 관계없이이를 말하는 것 같습니다. 이 SSE가 지속성이 필요합니다. Mojolicious에서 시간 제한을 사용 중지하면 성취 될 것으로 생각되지만 사실은 아닙니다.

제 질문은 다음과 같습니다. A) 연결이 여전히 활성화되어 있는지 어떻게 알 수 있습니까? 및 B) 사용자가 페이지를보고있는 한 지속적으로 연결을 유지하려면 어떻게해야합니까?

package Ownership; 
use Mojo::Base 'Mojo::EventEmitter'; 

sub newowner { 
    my $self = shift; 
    my ($owner, $location) = @_; 

    my $timestamp = localtime(time); 

    $self->emit(newowner => "[$timestamp] - 
     $owner has taken ownership of $location"); 
} 

package main; 

my $ownership = Ownership->new; 
get '/events' => sub { 
    my $self = shift; 

    Mojo::IOLoop->stream($self->tx->connection)->timeout(0); 

    $self->res->headers->content_type('text/event-stream'); 

    my $cb = $ownership->on(
     newowner => sub { 
      my ($ownership, $message) = @_; 
      $self->write("event:newowner\ndata: $message\n\n"); 
     } 
    ); 

    $self->on(
     finish => sub { 
      my $self = shift; 
      $ownership->unsubscribe(newowner => $cb); 
     } 
    ); 
}; 

그리고 여기 내 index.html.ep에서 자바 스크립트입니다 :

관련 Mojolicious 코드

는 여기

var events = new EventSource('<%= url_for 'events' %>'); 
events.addEventListener('newowner', function(event) { 
    div.innerHTML = div.innerHTML + event.data + '<br />'; 
}, false); 

답변

0

내가 크롬을 사용하기 때문에 내가 직접 대답 할 수 있습니다. 설치 과정에서 프록시 문제로 인해 연결이 끊어 질 수 있습니다. 브라우저에서 다시 시도하는 대신 영구적으로 연결을 끊을 수있는 코드를 보내는 경우가 있습니다.

readyState == EventSource.CLOSED인지 확인하는 타이머 이벤트가 있습니다. 그렇다면 수동으로 다시 연결합니다.