Laravel-使用自定义处理方法推送队列任务并删除作业


Laravel - Push queue task with a custom handling method and deleting job

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

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

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

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

尝试将Queue::later转换为Queue::push,代码将正常运行而不会出错。

至于显式删除队列中的任务,在大多数情况下是不必要的。但是,您必须考虑不提供自动删除作业的队列服务。

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