【问题标题】:Laravel - Push queue task with a custom handling method and deleting jobLaravel - 使用自定义处理方法和删除作业推送队列任务
【发布时间】:2017-03-26 16:12:59
【问题描述】:

考虑这种将任务推送到队列以运行位于同一类中的自定义处理程序方法的代码:

<?php namespace Space;

class Spaceship {

    public static function cruise()
    {
        // Throtting in 3 seconds...
        Queue::later(3, '\Space\Spaceship@throttle', $coordinates, 'queue-name');
    }

    public static function throttle($job, $data)
    {
        $job->delete();
        return 'ok';
    }

}

在我添加 $job->delete(); 之前这工作正常;但现在它给出了一个错误:

exception 'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Call to a member function delete() on a non-object

Laravel 4.2 docs 中没有解释为什么使用指向自定义处理程序方法的推送队列任务您不需要使用 $job->delete() 从队列中显式删除任务?然而,这种实现是有效的,当记录 $job 参数时,它是错误的。

【问题讨论】:

    标签: php laravel laravel-4 iron.io push-queue


    【解决方案1】:

    转到app\config\queue.php 并检查default 键。如果后者设置为sync,则上述行为是预期的。

    sync 驱动程序会立即运行您的任务,这意味着,Queue::later 实际上是Queue::push

    尝试将您的Queue::later 转换为Queue::push,代码将正常运行。

    至于显式删除队列中的任务,大部分是不必要的。但是,您必须考虑不提供自动删除作业的队列服务。

    就我而言,AWS SQS(消息队列服务)会在将作业从队列管中拉出后自动删除它。

    【讨论】:

    • 默认设置为“iron”...但 IronMQ 会像 AWS SQS 一样删除作业,然后它会解释这种行为。
    • 那么是的;如果 ironMQ 自动删除作业,则其引用不再有效(因此 $job 的布尔值是 false)。不得不说,使用 AWS SQS 和$job-&gt;delete() 并没有给我抛出任何错误。
    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    相关资源
    最近更新 更多