我有一个用户和帖子的数据库表。我想要做的是建立一个系统,为每个用户运行一个单独的队列作业。
所以我要做的就是选择所有用户:
$users = User::all();
然后遍历每个用户以启动队列:
foreach ($users as $user) {
// dispatch queue job that goes through each user's posts
}
现在我为每个用户运行了一个队列作业。但是,我需要永久运行此作业,以便在达到用户的上一篇文章时,作业重新启动并返回到用户的最新帖子并继续循环。
如何创建此队列系统?
答案 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',
],
];
现在我们有一个完整的端到端。一旦完成工作,它将播放一个事件。一旦被触发,听众将收到该事件。然后,侦听器将再次调度作业,传入用户。