2015-02-20 1 views
1

Я написал следующую программу (redis.pl), Redis выполняется локально с настройками порта по умолчанию, но когда я бегу redis.pl с morbo redis.pl я никогда не ********* 1 на экране. Почему это? Кажется, подписка никогда не бывает. Как я могу это исправить?Невозможно получить Mojo :: Redis2 подписаться

#!/usr/bin/perl 

use v5.18; 
use warnings; 

use Mojolicious::Lite; 
use Mojo::Redis2; 

say "Welcome"; 

my $redis = Mojo::Redis2->new(); 

$redis->subscribe(['pubsub'] => sub { 
    say "********* 1"; 
}); 

get '/' => sub { 
    my $self = shift; 

    $self->render(json => {a => 1}); 
}; 

app->start; 

ответ

2

У меня нет экземпляра redis, установленного в настоящее время, но я думаю, что это должно сработать.

#!/usr/bin/perl 

use v5.18; 
use warnings; 

use Mojolicious::Lite; 
use Mojo::Redis2; 

say "Welcome"; 

helper redis => sub {state $redis = Mojo::Redis2->new()}; 

app->redis->subscribe(['pubsub'] => sub { 
    say "********* 1"; 
}); 

get '/' => sub { 
    my $self = shift; 

    $self->render(json => {a => 1}); 
}; 

app->start; 

Я подозреваю, что как только экземпляр redis выходит из сферы действия, вы потеряете его и его соединения.

+0

Но почему '' 'my $ redis = ...' '' выходит за рамки? Я думал, что выполнение программы останавливается при запуске app-> start, что * должно означать, что '' my $ redis'' все еще жив. – alexk

+2

с циклами событий и реакторами, я бы не стал делать ставку на это :-) –

0

Я решил его, убедившись, я сохраняю значение, возвращаемое $redis->subscribe в постоянной переменной, например, так:

Вместо ...

$redis->subscribe(['pubsub'] => sub { 
    say "********* 1"; 
}); 

... Я написал ...

our $subscription = $redis->subscribe(['pubsub'] => sub { 
    say "********* 1"; 
}); 

Это устранило проблему. Я думаю, это похоже на AnyEvent, где возвращаемое значение должно оставаться в живых.

+1

subscribe возвращает экземпляр redis, поэтому, сохраняя его в своей переменной пакета (неправильно названной '$ subscription'), вы держите ссылку на экземпляр (как я упоминаю в своем ответе). –

+0

Вы правы. Если бы я только заменил '' 'my $ redis =' '' '' 'наш $ redis =' '', это также решило бы мою проблему. Помощник в вашем ответе выглядит как более чистое решение. – alexk