Apache-Backend-POE
view release on metacpan or search on metacpan
examples/server.pl view on Meta::CPAN
#!/usr/bin/perl
use lib qw(/home/httpd);
use warnings;
use strict;
use POE qw( Filter::Reference Component::Server::TCP);
use Apache::Backend::POE::Message;
$|++;
my %id_to_name; # $id_to_name{$id} = $name;
my %name_to_ids; # $name_to_ids{$name}{$id}++;
my $legend = {
new => '*',
ping => '+',
inactive => '-',
unknown => '?',
disconnected => 'X',
};
print "Legend:\n";
foreach (sort keys %$legend) {
print "\t$_ = $legend->{$_}\n";
}
# Matrix works, but not quite what I REALLY want
our $x = Matrix->new({
actions => $legend,
});
POE::Session->create(
inline_states => {
_start => sub {
POE::Component::Server::TCP->new(
Port => 2021,
Address => '127.0.0.1',
ClientFilter => 'POE::Filter::Reference',
ClientConnected => \&handle_client_connect,
ClientDisconnected => \&handle_client_disconnect,
ClientError => \&handle_client_error,
ClientInput => \&handle_client_input,
InlineStates => {
send => \&do_send_request,
},
);
$_[KERNEL]->delay_set(show => 2);
},
show => sub {
print sprintf("\r%s ", $x->matrix());
$_[KERNEL]->delay_set(show => 2);
},
},
);
$poe_kernel->run();
sub send {
my ($class, $request) = @_;
# Addressing a particular service.
my $service = $request->service();
if (defined $service and length $service) {
return unless exists $name_to_ids{$service};
foreach my $id (keys %{$name_to_ids{$service}}) {
$poe_kernel->post($id => send => $request);
}
return;
}
# General broadcast.
foreach my $backend_client_id (keys %id_to_name) {
$request->{sendtime} = time();
$poe_kernel->post($backend_client_id => send => $request);
}
}
# Remainder are POE handlers for backend client sessions.
sub handle_client_connect {
my $session_id = $_[SESSION]->ID;
$id_to_name{$session_id} = undef;
$x->add($session_id);
$x->add_decay($session_id => 'inactive' => 10);
# print "session $session_id connected\r\n";
}
sub handle_client_disconnect {
my $session_id = $_[SESSION]->ID;
( run in 2.117 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )