2016-07-15 1 views
0

J'ai une table de base de données des utilisateurs et des messages. Ce que je veux faire est de mettre en place un système où un travail de file d'attente distinct est en cours d'exécution pour chaque utilisateur.Fractionner la file d'attente et toujours exécuter

donc ce que je ferais est de sélectionner tous les utilisateurs:

$users = User::all(); 

Et puis boucle à travers chaque utilisateur de démarrer une file d'attente:

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

Maintenant, j'ai un travail de file d'attente en cours d'exécution pour chaque utilisateur. Cependant, j'ai besoin que ce travail soit exécuté pour toujours, de sorte que lorsque le dernier message de l'utilisateur est atteint, le travail redémarre et retourne au dernier message de l'utilisateur et continue le cycle.

Comment puis-je créer ce système de file d'attente?

+0

Habituellement, les travaux de file d'attente sont destinés à gérer les processus de longue durée en arrière-plan. Un exemple de certains travaux de file d'attente communs serait des choses comme le téléchargement de fichiers ou l'encodage vidéo. Je suis curieux plus que tout: pourquoi pensez-vous que vous avez besoin d'un travail en attente pour gérer la récupération des enregistrements post? Encore plus loin, pourquoi voudriez-vous que la file d'attente fonctionne à perpétuité? Pouvez-vous décrire votre cas d'utilisation un peu plus? – maiorano84

+0

J'effectue des actions sur chacun des messages de l'utilisateur et je dois le faire continuellement. Sachez que la liste des utilisateurs est très courte et le nombre de messages est faible. – user6592471

Répondre

0

Vous pouvez avoir un travail diffusé un événement à la fin auquel un écouteur sera connecté. Cet auditeur va ensuite envoyer un travail pour refaire le travail.

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]); 
    } 
}); 

L'événement peut ressembler à ceci:

php artisan make:event UserPostsLoopEnded 

class UserPostsLoopEnded extends Event 
{ 
    use SerializesModels; 

    public $user; 

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

Ensuite, nous avons besoin de configurer un auditeur:

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]   
    } 
} 

Alors bien sûr, vous devez attach the listener. Allez-y et ouvrez la fenêtre App\Providers\EventServiceProvider, puis assurez-vous d'ajouter notre événement et notre écouteur au tableau $listen.

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

Maintenant, nous avons un bout à bout complet. Une fois le travail terminé, il diffusera un événement. L'auditeur recevra l'événement une fois qu'il a été déclenché. L'écouteur réexpédiera ensuite le travail en passant l'utilisateur.