【发布时间】:2014-11-03 12:24:31
【问题描述】:
我正在尝试在我的 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) 中不起作用?
【问题讨论】:
-
您能否对不使用 Protocol::WebSocket::Handshake::Server 的问题进行可运行的演示? (例如,它可以从 STDIN 读取,可以从
perl -E'$|=1; say "abc"; sleep 4; say "def";管道传输)您的问题是不必要的不可访问(除非它与 Protocol::WebSocket::Handshake::Server 相关,在这种情况下您应该提及)。 -
如果问题中发布的所有代码都在一个函数中,那么一旦该函数退出,$w 就会超出范围,从而取消计时器。
标签: perl websocket catalyst anyevent