2013-12-19 56 views
1

我從未設置過排隊系統。我決定給它一個鏡頭。看起來排隊系統工作正常。但是,它似乎沒有正確發送數據。這是我的代碼。使用Laravel 4.1和Beanstalkd將數據傳遞給隊列類

... 
$comment = new Comment(Input::all()); 
$comment->user_id = $user->id; 
$comment->save(); 

if ($comment->isSaved()) 
{ 
    $voters = $comment->argument->voters->unique()->toArray(); 
    Queue::push('Queues\NewComment', 
     [ 
     'comment' => $comment->load('argument', 'user')->toArray(), 
     'voters' => $voters 
     ] 
    ); 
    return Response::json(['success' => true, 'comment' => $comment->load('user')->toArray()]); 
} 
... 

處理這個看起來像這樣的類:

class NewComment { 

    public function fire($job, $data) 
    { 
     $comment = $data['comment']; 
     $voters = $data['voters']; 

     Log::info($data); 

     foreach ($voters as $voter) 
     { 
      if ($voter['id'] != $comment['user_id']) 
      { 
       $mailer = new NewCommentMailer($voter, $comment); 
       $mailer->send(); 
      } 
     } 

     $job->delete(); 
    } 

} 

這精美的作品使用同步隊列駕駛我的本地服務器上。但是,在我的生產服務器上,我使用Beanstalkd。隊列正在按照預期發射。但是,我得到這樣的錯誤:

[2013-12-19 10:25:02] production.ERROR: exception 'ErrorException' with message 'Undefined index: voters' in /var/www/mywebsite/app/queues/NewComment.php:10 

如果我打印出來的$data變量傳遞到NewComment隊列處理程序,我得到這樣的:

[2013-12-19 10:28:05] production.INFO: {"comment":{"incrementing":true,"timestamps":true,"exists":true}} [] [] 

我不知道這是爲什麼發生。任何人都有一個想法如何解決這個問題。

回答

0

我最終做的是堅持簡單的數字。我只將註釋的ID存儲在隊列中,然後在我的隊列處理程序類中完成所有處理。這是最簡單的方法。

0

因此,$選民顯然不是作爲有效載荷的一部分進入隊列。我會在Queue :: push()函數之外構建有效載荷陣列,記錄內容並準確查看要輸入的內容。

我發現如果您沒有獲得您期望的內容,很可能,它並不像你期望的那樣。

當你在它的時候,確保beanstalkd系統沒有被卡住的舊數據不正確。您可以在有效負載中添加一個時間戳,以幫助確保它是最新的數據,並安排刪除或埋沒沒有適當信息的任何作業 - 在開始處理它們之前進行檢查。只要看看豆圈管道中的物品計數,應該說明如果有卡住的工作。

我沒有對Laravel做過任何事情,但是我已經爲其他Beanstalkd和SQS支持的系統編寫了許多任務,最難的部分是當作業失敗時,您必須弄清楚哪裏出了問題,以及如何解決避免只是一遍又一遍地重做相同的故障。

0

你將在一個數組包裝數據如預期中的處理程序得到的數據:

array(
    array('comment' => $comment->load('argument', 'user')->toArray(), 
     'voters' => $voters 
     ) 
)