2012-02-23 1 views
5

Mojolicious perl 코드에서 나는 원격 클라이언트에서 생성되고 감시되는 작업을 처리합니다.다른 경로를 다루기위한 Mojolicious의 전역과 스레드

전 세계 변수 인 해시 배열로 작업을 유지합니다.

PUT '/ job/create'및 GET '/ job/status'의 핸들러에서 사용됩니다. PUT '/ job/create'로 새 작업을 추가 할 때 어레이는 서브 루틴 (아래 코드에서 4 개 요소 포함), 을 확장하지만 GET '/ job/status'를 통해 작업의 상태를 요청할 때, 작업 목록에 배열에 추가 된 요소가 없습니다 (2 요소). hypnotoad 스레드, 포크를하지 사용하는 한,

#!/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(); 

답변

6

이 정말 작동하지 않습니다

감사합니다, 여기에 월

는 코드입니다. 데이터베이스 또는 Cache::FastMmap과 같은 데이터를 저장하는 것이 좋습니다.

+0

도움 주셔서 감사합니다. 결국 CouchDB를 사용하여 솔루션으로 이동했습니다. 꽤 좋은 btw 보인다. :) –

+0

'perl your.app daemon -l'http : // * : 3000''도 작동 할 수 있습니다. [내장 웹 서버 참조] (http://mojolicio.us/perldoc/Mojolicious/Guides/Cookbook#Built2Din_web_server) – klekker

관련 문제