2013-12-19 3 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

То, что я в конечном итоге делал, придерживалось простых чисел. Я только сохранил идентификатор комментария в очереди, а затем выполнил всю обработку в классе обработчика очереди. Это был самый простой способ сделать это.

0

Таким образом, избиратели, похоже, не попадают в очередь как часть полезной нагрузки. Я бы построил массив полезной нагрузки вне функции Queue :: push(), зарегистрировал содержимое и посмотрел, что именно помещается.

Я нашел, если вы не получаете что-то, что ожидаете , скорее всего, он не вводится так, как вы ожидаете.

Пока вы на нем, убедитесь, что система beanstalkd не имеет старых данных, застрявших в ней, что является неправильным. Вы можете добавить временную метку в полезную нагрузку, чтобы убедиться, что это самые последние данные, и организовать удаление или похоронить любые задания, у которых нет соответствующей информации, - перед тем, как начать их обрабатывать. Просто глядя на количество предметов в трубах beanstalkd, должно быть ясно, если есть застрявшие рабочие места.

Я ничего не делал с Laravel, но я написал много задач для других систем, поддерживающих Beanstalkd и SQS, а тяжелая часть - это когда работа не работает, и вам нужно выяснить, что пошло не так, и как чтобы избежать повторного повторения одного и того же сбоя снова и снова.

0

Вы получите данные, как ожидается, в обработчике путем оборачивания данных в массиве:

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