0

我设置了一个推送队列来拨打相当多的电话号码并播放录音——一个由 Twilio 提供支持的爆炸公告系统。遍历每个号码并拨打电话需要时间,所以我希望使用推送队列来加快应用程序的导航。

我过去曾尝试在 Laravel 4 中使用 Iron.io 推送队列,似乎任何需要一段时间才能运行的任务,或者如果 HTTP 请求一开始很慢,则该fire()方法中的代码会运行多次,即使使用$job->delete()

这是我的队列处理程序的示例-

    class callLotsOfPeople {
    public function fire($job, $data) {
        // Do stuff with data, like calling lots of people.. takes time
        $job->delete();
        // For some reason this method can be called multiple times after a single queue push, 
        // resulting in multiple phone calls and angry clients
    }
}
4

2 回答 2

2

这可能为时已晚,但我遇到了同样的问题。我找到了一个修复并提交了一个拉取请求,将其包含在 Laravel 4.1 中。

基本上,代码更改允许您像这样传递 $options 数组

Queue::push('MyJob', $message, $queue, array('timeout' => 300));

IronMQ.class.php 中已经有该功能,但我找不到从 Laravel 传递它们的简单方法。希望他们包括这一点,使多个作业提交问题消失。:-)

https://github.com/laravel/framework/pull/3555

已编辑:将 Queue::pull 更改为 Queue::push,小错字。

于 2014-02-13T18:21:27.830 回答
1

我还没有完全利用推送队列,但是快速浏览一下 IronMQ 文档发现了以下内容:

长时间运行的过程 - 又名 202 的

如果您想花一些时间来处理消息,超过 60 秒超时,您必须使用 HTTP 状态代码 202 进行响应。请确保在发布消息时将“超时”值设置为您的最长时间'希望您的处理采取。如果您在“超时”过去之前没有显式删除该消息,则该消息将被重试。要删除消息,请检查“Iron-Subscriber-Message-Url”标头并向该 URL 发送 DELETE 请求。

通过:http ://dev.iron.io/mq/reference/push_queues/#long_running_processes__aka_202s

现在,Laravel 目前似乎不支持超时,因为有效负载是在幕后创建的,无法轻松访问。您可以在 4.1 分支上创建一个拉取请求,以专门为 Iron 推送队列实现此功能(提示:您需要同时编辑 QueueInterface 和所有队列驱动程序的 push() 函数)。

作为一种变通方法,也许您可$job->delete()​​以从一开始(而不是耗时的任务之后),Queue::push()如果有错误,再重新(或其中一部分)?就像是:

    class callLotsOfPeople {
        public function fire($job, $data) {
            $job->delete();
            
            // Do stuff with data, like calling lots of people.. takes time
    
            if ($error) {
                    Queue::push(...);
            }
        }
    }

让我知道是怎么回事,我以后可能会遇到类似的情况,想知道你是怎么解决的!

于 2014-01-07T00:47:19.240 回答