Perl Redis监听未订阅频道

时间:2018-11-27 17:29:24

标签: 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 = $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)
    });
}

从下面的路由器调用上面的

$router->websocket('/data_stream')->to('grid#data_stream');

1 个答案:

答案 0 :(得分:1)

这是我自己回答的第二个问题。 当我将Mojo :: Redis-new用作助手

时,这终于可以工作了

所以在路由器文件中;

$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)
    });
}