使用Laravel 4.1和Beanstalkd将数据传递到队列类

时间:2013-12-19 15:38:35

标签: queue laravel-4 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}} [] []

我不知道为什么会这样。任何人都知道如何解决这个问题。

3 个答案:

答案 0 :(得分:0)

所以美元选民显然没有作为有效载荷的一部分被列入队列。我将在Queue :: push()函数之外构建有效负载数组,记录内容,并准确查看所放入的内容。

我发现如果你没有得到你想要的东西,很可能,它不像你期望的那样被放入。

当你在它的时候,确保beanstalkd系统没有旧数据卡在其中是不正确的。您可以在有效负载中添加时间戳,以帮助确保它是最新数据,并安排删除或掩埋任何没有相应信息的作业 - 在开始处理之前进行检查。只要查看豆秆管中的物品数量,就应该明白是否存在卡住的工作。

我没有对Laravel做过任何事情,但是我为其他Beanstalkd和SQS支持的系统编写了许多任务,而困难的部分是当作业失败时,你必须弄清楚出了什么问题,以及如何避免一遍又一遍地重做同样的失败。

答案 1 :(得分:0)

我最终做的是坚持使用简单的数字。我只将注释的ID存储在队列中,然后在队列处理程序类中完成所有处理。这是最简单的方法。

答案 2 :(得分:0)

通过将数据包装在数组中,您将在处理程序中获得预期的数据:

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