2016-07-15 9 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', 
    ], 
]; 

これで、完全なエンドツーエンドが実現しました。ジョブが終了すると、イベントをブロードキャストします。イベントが発生すると、リスナーはそのイベントを受信します。リスナーは、ジョブを再度ディスパッチして、ユーザーを渡します。

関連する問題