每当有人更改数据库中的某个字段时,我的页面中有一个区域会发出一个事件。现在,该事件似乎触发了一段时间,但是经过一段时间的空闲时间后,当列更改时,我不再收到广播消息。
我有 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);