【问题标题】:POE: recurring server Alarms in a custom POE::ComponentPOE:自定义 POE::Component 中的重复服务器警报
【发布时间】:2015-06-09 14:02:03
【问题描述】:

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

在阅读了CPAN 上的一些 POE 文档并尝试了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我也尝试在

中初始化定时器
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)

但事实并非如此。可能它仍然是错误的会话。想法?

谢谢。

【问题讨论】:

    标签: perl poe


    【解决方案1】:

    我找到了自己的一种方式。我添加了一个额外的会话:

    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。可能还有其他/更好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多