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