我有一个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。
答案 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
中对此进行了测试