2015-06-09 3 views
0

Я пытаюсь настроить клиент-серверное приложение с помощью Perl POE.POE: повторяющийся сервер Сигнализация в пользовательском POE :: Компонент

После прочтения некоторых документов POE на CPAN и пытаемся некоторые из примеров cookbook,, наконец reccuring Alarms, я следующая проблема:

События в моем пользовательском компоненте обжигает внутри (клиент) сессий ,

package POE::Component::OXO_TCP_Server; 

use strict; 
use warnings; 
use POE; 
use POE::Filter::Reference; 
use POE::Component::Server::TCP; 

sub new { 
    my ($proto, %args) = @_; 
    my $class = ref ($proto) || $proto; 

    my $send_up_intervall = 10; 
    my %default = (
     Alias   => "oxo_tcp_server", 
     Address  => "localhost", 
     Port   => 12345, 
     ClientFilter => "POE::Filter::Reference", 
     ClientInput => \&handle_client_input, 

     ClientDisconnected => sub { 
      $_[KERNEL]->yield("shutdown"); 
     }, 

     SessionParams => [ options => { debug => 1, trace => 1 } ], 

     InlineStates => { 
     _start => sub { 
      $_[HEAP]->{next_alarm_time} = int(time()) + 1; 
      $_[KERNEL]->alarm(tick => $_[HEAP]->{next_alarm_time}); 
     }, 

     tick => sub { 
      print "tick at ", time(), "\n"; 
      $_[HEAP]->{next_alarm_time}++; 
      $_[KERNEL]->alarm(tick => $_[HEAP]->{next_alarm_time}); 
     }, 
     } 
    ); 

    # add \%args; to \%default 
    my $self = POE::Component::Server::TCP->new(%default); 
    return $self; 
} 

sub handle_client_input {...} 

1; 

Когда я посылаю некоторый вклад на сервер событий

=== 8071 === 2 -> tick (from ../lib/POE/Component/OXO_TCP_Server.pm at 65) tick at 1433857644 
... 

являются обжигали.

Но я хочу, чтобы они были уволены независимо от клиента (только по времени).

Как я могу это сделать? Я не нашел это в документации или поваренной книге.

Чтобы избежать перегрузки _start Я также попытался inititalize таймер в

Started => sub { 
    $_[HEAP]->{next_alarm_time} = int(time()) + 1; 
    $_[KERNEL]->alarm(tick => $_[HEAP]->{next_alarm_time}); 
}, 

на первый взгляд это выглядит как оно работает, потому что отлаживать говорит:

=== 8093 === 1 -> tick (from ../lib/POE/Component/OXO_TCP_Server.pm at 47) 

но это ISN «т. Может быть, это еще не тот сеанс. Идеи?

Спасибо.

ответ

0

Я нашел один путь себя. Я добавил дополнительную сессию:

POE::Session->create(
    inline_states => { 
     _start => sub { 

      $_[HEAP]->{next_alarm_time} = int(time()) + 1; 
      $_[KERNEL]->alarm(tick => $_[HEAP]->{next_alarm_time}); 
     }, 

     tick => sub { 
      print "tick at ", time(), "\n"; 
      $_[HEAP]->{next_alarm_time}++; 
      $_[KERNEL]->alarm(tick => $_[HEAP]->{next_alarm_time}); 
     }, 
    }, 
); 

Таким образом, это независимая форма в POE :: Компонент :: Server :: TCP. Может быть, есть другие/лучшие способы.