2016-07-15 4 views
0

나는 사용자와 게시물의 데이터베이스 테이블을 가지고 있습니다. 내가하고 싶은 일은 각 사용자에 대해 별도의 대기열 작업이 실행중인 시스템을 설정하는 것입니다. 각 사용자를 통해분할 대기열과 항상 실행

$users = User::all(); 

그리고 루프는 큐를 시작합니다 :

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

가 지금은 각 사용자에 대해 실행 큐 작업이

그래서 내가 무엇을 할 것 모든 사용자를 선택합니다. 그러나이 작업을 영원히 계속 실행해야하므로 사용자의 마지막 게시물에 도달하면 작업이 다시 시작되고 사용자의 최신 게시물로 돌아가서주기가 계속됩니다.

이 대기열 시스템을 어떻게 만듭니 까?

+0

일반적으로 대기열 작업은 백그라운드에서 장기 실행 프로세스를 처리하기위한 것입니다. 일반적인 대기열 작업의 예로는 파일 업로드 또는 비디오 인코딩과 같은 작업이 있습니다. 나는 무엇보다 호기심이 많습니다. 왜 포스트 레코드를 가져 오는 것을 처리하기 위해 큐 작업이 필요하다고 생각합니까? 심지어 큐를 영원히 계속 실행하는 이유는 무엇입니까? 유스 케이스를 좀 더 자세히 설명해 주시겠습니까? – maiorano84

+0

각 사용자의 게시물에 대해 작업을 수행하며이 작업을 계속해야합니다. 사용자 목록이 매우 짧고 게시물 수가 적음을 알고 있어야합니다. – user6592471

답변

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', 
    ], 
]; 

이제 완전한 결론을 맺었습니다. 일단 작업이 끝나면 이벤트를 브로드 캐스트합니다. 청취자는 일단 해고되면 이벤트를 수신합니다. 그러면 리스너는 작업을 다시 보내 사용자에게 전달합니다.