use POE qw( Wheel::Run::Win32 Filter::Line);
use POE::Component::Server::HTTPServer;
use POE::Component::Server::HTTPServer::Handler;
use POE::Component::JobQueue;
use POE::Filter::Reference;
use File::Basename;
use Data::Dump qw(dump);
use Cwd;
my $port=8080;
my $max_jobs=1;
sub _start {
my ( $kernel, $heap ) = @_[ KERNEL, HEAP ];
$heap->{httpserver} = POE::Component::Server::HTTPServer->new(
port=>$port,
handlers => [ "/add" => \&add_task]
);
$heap->{httpserver}->create_server();
POE::Component::JobQueue->spawn
( Alias => 'passive',
WorkerLimit => $max_jobs,
Worker => \&make_a_worker,
Passive => { }
);
}
sub add_task {
my $context = shift;
# request has a form http://server:port/add?file/name.mpg
$context->{request}->uri=~/\/add\?(.*)/; my @job_params=($1);
POE::Kernel->post( 'passive',
'enqueue',
'postback',
@job_params
);
$context->{response}->code(200);
$context->{response}->content(
"
add task ".join(" ",@job_params)."
\n"
);
return H_FINAL;
}
sub make_a_worker {
my ($postback, $message) = @_;
POE::Session->create(
inline_states => {
_start => \&worker_start,
_stop => sub {my $session=$_[SESSION];
print "session ",$session->ID," stop\n";},
worker_child_stdout => \&worker_child_stdout,
worker_closed=> \&worker_closed,
sig_child => \&sig_child,
},
args => [ @_ ]
);
}
sub worker_start
{
my ($kernel,$session,$heap,@args) = @_[KERNEL, SESSION, HEAP, ARG0 .. $#_];
$heap->{postback} =$args[0];
$heap->{filename} =$args[1];
$heap->{cmdline} = POE::Wheel::Run::Win32->new(
Program => executable,
ProgramArgs => \@args,
StdoutEvent => "worker_child_stdout",
StderrEvent => "worker_child_stdout",
CloseEvent => "worker_closed",
StdioFilter => POE::Filter::Line->new(),
StderrFilter => POE::Filter::Line->new()
);
}
sub worker_child_stdout
{
my ( $heap, $stdout ) = @_[ HEAP, ARG0 ];
# this code sets $heap->{results}="BUSY"
# when captures this line from the executable's output
}
## NOW THE CLOSEST TO THE QUESTION PART
sub worker_closed
{
my ( $kernel, $heap ) = @_[ KERNEL, HEAP ];
my $postback=delete $heap->{postback};
my @results=($heap->{results});
# skipped code, deleting the intermediate created files
my $d=delete $heap->{cmdline};
$postback->(@results);
if($results[0] eq "BUSY") {
print "worker_closed: engine busy, repeat\n";
my @job_params=($heap->{filename});
POE::Kernel->post( 'passive',
'enqueue',
'postback',
@job_params);
}
}