【发布时间】:2015-08-19 14:06:25
【问题描述】:
我在 \app\Events\TestEventTriggered.php 下创建了一个测试事件:
<?php
namespace App\Events;
use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class TestEventTriggered extends Event
{
use SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct()
{ }
/**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return [];
}
}
还有一个 app\Listeners\ListenToMyEvent.php 下的事件监听器:
<?php
namespace App\Listeners\Events;
use App\Events\TestEventTriggered;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldBeQueued;
class ListenToMyEvent implements ShouldBeQueued
{
use InteractsWithQueue;
/**
* Create the event handler.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param TestEventTriggered $event
* @return void
*/
public function handle(TestEventTriggered $event)
{
// do some stuff
}
}
在 app\Providers\EventServiceProvider.php 中:
protected $listen = [
'App\Events\TestEventTriggered' => [
'App\Listeners\ListenToMyEvent'
]
];
然后我在模型的保存方法中触发事件:
\Event::fire(new \App\Events\TestEventTriggered);
当我现在保存我的模型时,事件会同步处理。所以事件的handle方法没有被队列处理。
文档说要在侦听器中实现 ShouldBeQueued 合同,我的侦听器就是这种情况。但是,我应该如何将事件的句柄方法实际推送到队列中?我在这里缺少哪些步骤?我在哪里声明应该将事件推送到哪个队列/管? 我正在使用 Amazon SQS 来处理我的队列。
laravel 文档对这个问题有点困惑......
感谢任何帮助。
【问题讨论】:
-
我认为文档很简单,laravel.com/docs/5.1/queues#pushing-jobs-onto-the-queue。需要有后台进程运行才能监听队列:
php artisan queue:listen -
是的,监听器正在运行,但问题是我无法设置队列。我有几个队列,所以它只需要队列配置文件中的默认队列
-
根据文档,您可以使用 onQueue('queue_name') 指定要将作业分派到哪个位置。
$job = (new SendReminderEmail($user))->onQueue('emails'); $this->dispatch($job);
标签: laravel events queue amazon-sqs laravel-5.1