2013-12-19 37 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 
     ) 
)