POE::Component::JobQueue->spawn ( Alias => 'MyQueue', WorkerLimit => $numOfWorkerThreads, Worker => \&make_a_worker, Passive => { }, ); # Code that creates a seperate Session # Snipped due to Vendor limits sub handle_message { $kernel->yield( enqueue_msg => $msg ); } exit 0; # This gets posted to sub enqueue_msg { my ($kernel, $session, $message) = @_[ KERNEL, SESSION, ARG0 ]; print "-enqueue_job: -- Session: ", $session->ID, " message\n"; $kernel->post( MyQueue => 'enqueue', 'finish_job', $message ); } sub make_a_worker { my ( $postback, $message ) = @_; my @results = create_worker_session( $message ); $postback->(@results); } ## Do the actual creation of the worker session sub create_worker_session { my $message = shift; POE::Session->create( inline_states => { _start => \&worker_start, worker_child_stdout => \&worker_child_stdout, worker_closed => \&worker_closed, sig_child => \&sig_child, }, args => [ '', $message ], ); return "Message ID: ".$message->getHeaderField('MessageID')." -- Finished... \n"; } sub worker_start { my ($kernel, $session, $heap, @args ) = @_[KERNEL, SESSION, HEAP, ARG0 .. $#_]; $heap->{MessageID} = $args[1]->getHeaderField('MessageID'); $heap->{SessionID} = $session->ID; print " Message ID: ".$heap->{MessageID}; print " -start_message_process: ".$heap->{SessionID}."\n"; my $fullCMD = "/my/long/running/command -i foobar"; $heap->{cmdlinefish} = POE::Wheel::Run->new( Program => $fullCMD, StdoutEvent => "worker_child_stdout", CloseEvent => "worker_closed", StdioFilter => POE::Filter::Reference->new(), ); print " Message ID: ".$heap->{MessageID}; print " -start_message_process (end): ".$heap->{SessionID}."\n"; } sub worker_child_stdout { my ( $heap, $preargs ) = @_[ HEAP, ARG0 ]; print " Message ID: ".$heap->{MessageID}; print " -worker_child_stdout: $preargs\n"; } sub worker_closed { my ( $kernel, $heap, $preargs ) = @_[ KERNEL, HEAP, ARG1 ]; print " Message ID: ".$heap->{MessageID}; print " -worker_closed: $preargs\n"; $kernel->yield('sig_child'); } sub sig_child { my ( $heap, $sig, $pid, $exit_val ) = @_[ HEAP, ARG0, ARG1, ARG2 ]; my $details = delete $heap->{cmdlinefish}; print " Message ID: ".$heap->{MessageID}; print " -sig_child\n"; return 0; }