2016-07-15 3 views
0

У меня есть таблица базы данных пользователей и сообщений. Я хочу создать систему, в которой для каждого пользователя выполняется отдельное задание очереди.Разделить очередь и всегда запускать

Так что я хотел бы сделать, это выбрать все пользователь:

$users = User::all(); 

А затем цикл по каждому пользователю начать очереди:

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

Теперь у меня есть задание очереди выполняется для каждого пользователя. Тем не менее, мне нужно, чтобы эта работа выполнялась навсегда, так что, когда достигнут последний пост пользователя, задание перезапускается и возвращается к последнему сообщению пользователя и продолжает цикл.

Как создать эту систему очередей?

+0

Обычно задания Queue предназначены для обработки длительных процессов в фоновом режиме. Примером некоторых общих заданий в очереди будут такие вещи, как загрузка файлов или кодирование видео. Мне любопытно больше всего: почему, по-вашему, вам нужна работа в очереди, чтобы обрабатывать записи записей? Еще больше, почему вы хотите, чтобы очередь работала бесконечно? Можете ли вы описать свой прецедент немного больше? – 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', 
    ], 
]; 

Теперь у нас есть полный конец. Как только работа будет завершена, он будет транслировать событие. Слушатель получит событие после его увольнения. Затем слушатель снова отправит задание, передав его пользователю.

Смежные вопросы