POE:循环服务器自定义POE告警::Component



我正在尝试使用perl POE设置客户机-服务器应用程序。

在阅读了一些关于CPAN的POE文档并尝试了一些烹饪书的示例后,最终收到了警报,我有以下问题:

自定义组件中的事件在(客户端)会话中触发。

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,我还尝试初始化 中的计时器。
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)

但它不是。也许这仍然是错误的会议。想法吗?

谢谢。

我自己找到了一条路。我添加了一个额外的会话:

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::Component::Server::TCP。也许有其他更好的方法。

最新更新