2015-01-11 11 views
5

Ho bisogno di controllare se il lavoro aggiunto alla coda (Beanstalkd) è stato completato in Laravel (Laravel 5) e nel caso sia completato ho bisogno di restituire il record aggiornato (attività aggiunta al record degli aggiornamenti della coda nel database). Ho aggiunto al mio composer.json:Come verificare se il lavoro nella coda Beanstalkd è stato completato in Laravel

"pda/pheanstalk": "3.*" 

aggiungo lavoro di coda in questo modo:

$jobId = Queue::push('App\Class', $object->toArray(), $this->getQueueName()); 

che uso per controllare se lavoro è stato completato utilizzando è la seguente funzione:

public function find($queueName, $jobId, $recordId) 
{ 
    $phean = Queue::getPheanstalk(); 

    try { 
     $phean->peek($jobId); 
     $data = ['status' => 'waiting']; 
    } catch (ServerException $e) { 
     $message = $e->getMessage(); 

     if ($message == 'NOT_FOUND: Job ' . $jobId . ' does not exist.') { 
      $data = ... // here I get from database data for $recordId 

     } else { 
      $data = ['status' => 'error']; 
     } 
    } 

    return $data; 
} 

La domanda è: è un metodo affidabile per verificare se il lavoro è stato completato? Paragono qui solo il messaggio che ottengo dall'eccezione. Non ho trovato nessun altro modo per verificare se il lavoro è stato completato.

risposta

1

Non ho ancora usato Laravel 5, ma su Laaravel 4, hai la tabella dei lavori falliti. Dove puoi vedere quali lavori NON sono stati completati. Suppongo che L5 potrebbe avere qualcosa o mantenere lo stesso processo. Questo non risolverebbe il tuo problema?

Dal mio punto di vista sembra che si stia invertendo solo la prospettiva. Invece di cercare ciò che è fallito, stai cercando ciò che ha funzionato.

Fonte: http://laravel.com/docs/4.2/queues#failed-jobs

0

Non faccio uso di laravel 5 ancora. Ma con Laravel 4, quando un lavoro è finito, deve essere cancellato manualmente dalla coda. Ecco la documentazione ufficiale:

Deleting A Processed Job: Once you have processed a job, it must be deleted from the queue, which can be done via the delete method on the Job instance

Significa semplicemente che se non hai utilizzare tale metodo, lo stato del lavoro rimarrà incompiuto. Nel tuo caso, puoi ottenere la coda e vedere se l'ID del lavoro è lì.

+0

Hai ragione, ma il lavoro passa ai lavori falliti quando fallisce. Quindi, quando voglio verificare se il lavoro è stato completato anche se ho esaminato i lavori falliti, ho bisogno di controllare in qualche modo se il lavoro è ancora in coda perché potrebbe essere ancora in coda e non in lavori falliti. –

+0

Ehi, sembra che pbeanstalk non offra un modo per ottenere un intero elenco di lavori in esecuzione. È possibile memorizzare le informazioni relative al lavoro nel database e contrassegnarne lo stato quando viene eliminato o non riuscito. – Ray

0

Se è necessario attivare un comando in base alla finitura di un lavoro, allora sembra che si debba solo attivare un comando in coda quando il lavoro è completo, quindi il sistema può gestire il resto?

In caso contrario, 'polling' per il lavoro per vedere se/quando è completato sembra ingombrante e inefficiente.

In laravel 5 - si potrebbe evento utilizzare il nuovo strumento di comandi che Taylor ha fornito, e hanno l'attuazione ShouldBeQueued applicata - in modo che il comando è in coda per eseguire al completamento della vostra altro compito.

Problemi correlati