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 )