On Sun, Aug 24, 2003 at 05:07:09PM -0500, Jake wrote:
> Hi,
>
> if I have (roughly) the code below. I can interact with the server from a
> client, but is there anyway for me to get the server to run "some_process()"
> routinely, __without__ any client interaction.
>
> Thanks
> Jay
>
> #!/usr/bin/perl
>
> use warnings;
> use strict;
> use POE qw(Component::Server::TCP);
> use Net::Server::Daemonize qw(daemonize);
>
> daemonize('nobody','nobody','/var/mydaemon.pid');
>
> POE::Component::Server::TCP->new(
> Address => "localhost",
> Port => 12345,
> ClientFilter => "POE::Filter::Reference",
> ClientInput => \&clientInput
ClientConnected => \&start_routine_process,
InlineStates => {
do_routine_process => \&some_process,
},
> );
>
> $poe_kernel->run();
>
> sub clientInput {
> my ( $heap, $list ) = @_[ HEAP, ARG0 ];
> my @symbol = ref $list eq "ARRAY" ? @$list : $list;
my @list;
push @{$heap->{things_to_do}}, [EMAIL PROTECTED];
> }
sub start_routine_process {
$_[HEAP]->{things_to_do} = [ ]; # start with an empty list
$_[KERNEL]->delay(do_routine_process => 60); # check it in a minute
}
> sub some_process {
my ($kernel, $heap) = @_[KERNEL, HEAP];
while (my $next_thing = shift @{$heap->{things_to_do}}) {
$heap->{client}->put("@$next_thing");
}
unless ($heap->{shutdown}) {
$kernel->delay(do_routine_process => 60);
}
> }
What's going on here?
When the client connects, start_routine_process() sets a timer called
"do_routine_process" for sixty seconds in the future. It also
initializes a job queue in the session's heap.
Every time the "do_routine_process" timer goes off, some_process() deals
with everything in the job queue. It also sets another timer for sixty
seconds in the future, but only if the connection has not been shut
down. This effectively polls for jobs once a minute, as long as the
client is connected. It also guarantees that all enqueued jobs are
handled.
Caveat utilitor, or some junk: I haven't tested any of the above code.
--
Rocco Caputo - [EMAIL PROTECTED] - http://poe.perl.org/