Perl Redis listen不订阅通道
这段代码似乎不起作用,我不知道如何调试。。我正在使用Mojolicious通过websocket发送订阅的消息Perl Redis listen不订阅通道,perl,redis,mojolicious,Perl,Redis,Mojolicious,这段代码似乎不起作用,我不知道如何调试。。我正在使用Mojolicious通过websocket发送订阅的消息 use Mojo::Redis; #Controller sub data_stream { my $c = shift; $c->inactivity_timeout(300); my $redis = Mojo::Redis-new('redis://xxxxxxxx@localhost:6379/'); my $pubsub = $redi
use Mojo::Redis;
#Controller
sub data_stream {
my $c = shift;
$c->inactivity_timeout(300);
my $redis = Mojo::Redis-new('redis://xxxxxxxx@localhost:6379/');
my $pubsub = $redis->pubsub;
my $cb = $pubsub->listen('data' => sub {
my ($pubsub, $msg) = @_;
$c->app->log->debug("WS: $msg");
$c->send({text => $msg});
});
$c->on(finish => sub {
$c->app->log->debug("WS CONNECTION CLOSED!");
$pubsub->unlisten('data' => $cb)
});
}
从下面的路由器调用上面的Sub
$router->websocket('/data_stream')->to('grid#data_stream');
哈哈,这是我自己回答的第二个问题。 当我将Mojo::Redis新位作为助手移动时,这一点终于起作用了 所以在路由器文件中
$self->helper(redis => sub {
state $redis = Mojo::Redis->new('redis://anything:jejakredis1234!@localhost:6379/');
});
和在控制器中
sub data_stream {
my $c = shift;
$c->inactivity_timeout(300);
my $pubsub = $c->redis->pubsub;
my $cb = $pubsub->listen('data' => sub {
my ($pubsub, $msg) = @_;
$c->app->log->debug("WS: $msg");
$c->send({text => $msg});
});
$c->on(finish => sub {
$c->app->log->debug("WS CONNECTION CLOSED!");
$pubsub->unlisten('data' => $cb)
});
}
你能包括设置websocket的其余代码(从$c和$c->app的使用中,我假设它在一个有趣的websocket路径中)并描述什么不起作用吗?@Grinnz谢谢。我已经编辑了我的帖子。代码基于模块示例,但URI部分的密码除外。为了验证它是否正常工作,我有另一个使用Redis模块的脚本。每次我直接从redis Clip发布时,这个脚本都会工作。问题可能是您的Mojo::redis对象在该操作结束时超出范围,从而关闭连接。通过在助手中将其声明为状态变量,它将在该过程的其余部分保持不变。@grinz谢谢!是的,我也注意到了。但是它是如何以及何时超出范围的呢?“my”变量在声明它们的块的末尾超出范围,如果没有其他变量对它们进行强引用的话。我明白了。。我想当它到达“listen”时,引用会停留在该块中