私のページには、誰かがデータベースの特定のフィールドを変更するたびにイベントを発行する領域があります。現在、イベントはしばらく発生しているように見えますが、一定のアイドル時間の後、列が変更されたときにブロードキャスト メッセージを受信しなくなりました。
Firebug がありますが、接続がまだ開いていることを確認する方法が完全にはわかりません。Firebug を見ると、「CLOSED: 2, CONNECTING: 0, OPEN: 1, readyState: 0」と表示されていますが、イベントが発生しているかどうか (発行、表示) に関係なく、このように表示されているようです。この SSE を永続化する必要があります。これは、Mojolicious でタイムアウトを無効にすることで実現できると考えていましたが、そうではないようです。
私の質問は次のとおりです: A) 接続がまだアクティブかどうかを確認するにはどうすればよいですか? B) ユーザーがページを表示している間、接続を維持するにはどうすればよいですか?
関連する Mojolicious コードは次のとおりです。
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 からの Javascript があります:
var events = new EventSource('<%= url_for 'events' %>');
events.addEventListener('newowner', function(event) {
div.innerHTML = div.innerHTML + event.data + '<br />';
}, false);