8

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

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

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

    $resetPasswordJob->onQueue('SMS');

    $this->dispatch($resetPasswordJob);

我的工作类是这样的:

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

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

[无效参数异常]

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

注意:其他方式是将事件添加到 EventServiceProvider 的监听属性并触发事件。但它不适用于指定队列名称。

4

2 回答 2

19

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

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 中对此进行了测试

于 2018-05-26T14:45:13.383 回答
0

你在错误的地方调用 onQueue
应该如下所示

dispatch(new YourJob())->onQueue('my_queue');

让它发挥作用

php artisan queue:work --queue=my_queue
于 2022-01-20T08:16:13.460 回答