如何在指定队列时运行Laravel作业

时间:2016-09-06 19:19:02

标签: laravel-5 queue laravel-5.1 task-queue laravel-queue

我有一个Job可以向用户发送短信。我想在指定队列名称上运行此作业。例如,此作业已添加到“ SMS ”队列中。所以我找到了一种方法,但它存在一些错误。

创建作业实例并使用onQueue()函数执行此操作

    $resetPasswordJob = new SendGeneratedPasswordResetCode(app()->make(ICodeNotifier::class), [
        'number' => $user->getMobileNumber(),
        'operationCode' => $operationCode
    ]);

    $resetPasswordJob->onQueue('SMS');

    $this->dispatch($resetPasswordJob);

我的Job类是这样的:

class SendGeneratedPasswordResetCode implements ShouldQueue
{
   use InteractsWithQueue, Queueable;

/**
 * The code notifier implementation.
 *
 * @var ICodeNotifier
 */
protected $codeNotifier;

/**
 * Create the event listener.
 *
 * @param ICodeNotifier $codeNotifier
 * @return self
 */
public function __construct(ICodeNotifier $codeNotifier)
{
    $this->codeNotifier = $codeNotifier;
}

/**
 * Handle the event.
 *
 * @return void
 */
public function handle()
{
    echo "bla blaa bla";
    #$this->codeNotifier->notify($event->contact->getMobileNumber(), $event->code);
}

public function failed()
{
    var_dump("failll");
}
}

所以我输入这个命令来控制:

php artisan queue:listen --queue=SMS --tries=1

但是我在执行此作业时收到此错误消息:

  

[InvalidArgumentException]

     

没有为命令[App \ Services \ Auth \ User \ Password \ SendGeneratedPasswordResetCode]注册处理程序

注意:其他方法是将事件添加到EventServiceProvider的 listen 属性并触发事件。但它不适用于指定queue-name。

1 个答案:

答案 0 :(得分:2)

您还可以通过在构造上设置Job对象queue属性来指定要将作业放置到的队列:

class SendGeneratedPasswordResetCode implements ShouldQueue
{
    // Rest of your class before the construct

    public function __construct(ICodeNotifier $codeNotifier)
    {
        $this->queue = 'SMS'; // This states which queue this job will be placed on.
        $this->codeNotifier = $codeNotifier;
    }

    // Rest of your class after construct

然后,您不需要为此作业的每个实现/使用提供->onQueue()方法,因为Job类本身将为您执行此操作。

我在Laravel 5.6

中对此进行了测试