我正在尝试在我的 Catalyst、AnyEvent、Websocket 应用程序中构建超时场景。为此,我正在使用
AnyEvent->timer
假设几秒钟不活动(不再有 WS 帧进入)后应该调用它。
问题是,我的计时器从未执行过:
my $w = AnyEvent->timer (after => 3,
cb => sub {
warn "TIMEOUT!";
});
$self->{server} = Protocol::WebSocket::Handshake::Server->new_from_psgi(
$c->req->env) or die $c->log->fatal($!);
$self->{handle} = AnyEvent::Handle->new(
fh => $c->req->io_fh,
on_error => sub {
my ($hd, $fatal, $msg) = @_;
$clean_up->();
}
);
die $c->log->fatal("WS Server error: '$_'")
if $self->{server}->error;
$self->{server}->parse($self->{handle}->fh);
$self->{handle}->push_write($self->{server}->to_string);
$self->{handle}->on_read(sub {
(my $frame = $self->{server}->build_frame)->append($_[0]->rbuf);
while (my $frame_msg = $frame->next) {
...
}
计时器回调永远不会执行。我的猜测是,计时器在另一个事件循环(AnyEvent::Handle)中不起作用?