拆分队列并始终运行

时间:2016-07-15 05:03:43

标签: laravel laravel-5 queue laravel-5.2 beanstalkd

我有一个用户和帖子的数据库表。我想要做的是建立一个系统,为每个用户运行一个单独的队列作业。

所以我要做的就是选择所有用户:

$users = User::all();

然后遍历每个用户以启动队列:

foreach ($users as $user) {
    // dispatch queue job that goes through each user's posts
}

现在我为每个用户运行了一个队列作业。但是,我需要永久运行此作业,以便在达到用户的上一篇文章时,作业重新启动并返回到用户的最新帖子并继续循环。

如何创建此队列系统?

1 个答案:

答案 0 :(得分:0)

您可以让作业广播最后会附加侦听器的事件。然后,这个监听器将派遣一份工作再次完成工作。

php artisan make:job LoopUserPosts

$posts = $user->posts;
$posts->each(function($post){
    //your work on your post
    if($post->id === $posts->count()){
        // broadcast your event here
        event(App\Events\UserPostsLoopEnded, [$post->user]);
    }
});

事件可能如下所示:

php artisan make:event UserPostsLoopEnded

class UserPostsLoopEnded extends Event
{
    use SerializesModels;

    public $user;

    public function __construct(App\User $user)
    {
        $this->user = $user;
    }
}

然后我们需要设置一个监听器:

php artisan make:listener HandleUserPostsLoopEnded --event="UserPostsLoopEnded"

use App\Events\UserPostsLoopEnded;

class HandleUserPostsLoopEnded
{   
    public function __construct()


    public function handle(UserPostsLoopEnded $event)
    {
        //now we can just dispatch the job again
        dispatch(App\Jobs\LoopUserPosts, [$event->user]         
    }
}

当然,你需要attach the listener。继续并弹出App\Providers\EventServiceProvider,然后确保我们将事件和我们的监听器添加到$listen数组中。

protected $listen = [
    //.....
    'App\Events\UserPostsLoopEnded' => [
        'App\Listeners\HandleUserPostsLoopEnded',
    ],
];

现在我们有一个完整的端到端。一旦完成工作,它将播放一个事件。一旦被触发,听众将收到该事件。然后,侦听器将再次调度作业,传入用户。