2012-02-23 15 views
5

En mi código de Mojolicious Perl manejo un trabajo creado y observado desde un cliente remoto.Globals and Threads en Mojolicious para manejar diferentes rutas

Guardo los trabajos en una matriz de valores hash, que es una variable global.

Se utiliza luego en controladores de PUT '/ job/create' y GET '/ job/status'. Al agregar un nuevo trabajo con PUT '/ job/create' la matriz obtiene extendida en la subrutina (contiene 4 elementos en el código siguiente), pero al solicitar el estado de los trabajos a través de GET '/ job/status' la lista de trabajos , la matriz no contiene los elementos agregados (cuenta con 2 elementos ).

Gracias, Jan

Aquí está el código:

#!/usr/bin/perl -w 

use threads; 
use threads::shared; 
use Mojolicious::Lite; 
use Mojo::JSON; 
my (%record, %job1, %job2, %job3, @jobs) : shared; 

%job1 = (id=>"id1"); 
%job2 = (id=>"id2"); 
%job3 = (id=>"id3"); 

push (@jobs, \%job1); 
push (@jobs, \%job2); 

app->config(hypnotoad => {listen => ['http://*:3000']}); 

put '/job/create' => sub { 
    my $self = shift; 
    my $obj = Mojo::JSON->decode($self->req->body); 
    my $id = $obj->{id}; 
    %record = (id => $id); 
    push (@jobs, \%record); # test the global prefilled 
    push (@jobs, \%job3); # test the global locally filled 
    $self->render(text => "Created job id $id. Jobs count: " . 
$#jobs); 
}; 

get '/job/status' => sub { 
    my $self = shift; 
    my $out = "["; 
    for(my $i=0; $i<$#jobs+1; $i++) { 
     $out .= "{id:\"" . $jobs[$i]{id}  . "\","; 
     $out .= "," if $i<$#jobs; 
    } 
    $out .= "]"; 
    $self->render(text => "allJobsInfo($out). Num jobs: " . $#jobs); 
}; 

app->start(); 

Respuesta

6

esto no va a trabajar de verdad, como hypnotoad es el uso de tenedor, no temas. Sugiero almacenar datos en algo así como una base de datos o Cache::FastMmap.

+0

Gracias por la ayuda. Al final, pasé a una solución con CouchDB. Se ve muy bien por cierto. :) –

+0

Alternativa 'perl your.app daemon -l 'http: // *: 3000'' podría funcionar, también. [ver el servidor web incorporado] (http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Built2Din_web_server) – klekker