Разделить очередь и всегда запускать

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

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

$users = User::all();

А затем прокрутите каждого пользователя, чтобы запустить очередь:

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

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

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


person user6592471    schedule 15.07.2016    source источник
comment
Обычно задания очереди предназначены для обработки длительных процессов в фоновом режиме. Примером некоторых распространенных заданий очереди могут быть такие вещи, как загрузка файлов или кодирование видео. Мне больше всего любопытно: почему, по вашему мнению, вам нужно задание в очереди для обработки извлечения почтовых записей? Более того, почему вы хотите, чтобы очередь работала вечно? Можете ли вы описать свой вариант использования немного больше?   -  person maiorano84    schedule 15.07.2016
comment
Я выполняю действия над каждым из сообщений пользователя, и мне нужно делать это постоянно. Знайте, что список пользователей очень короткий, а количество сообщений невелико.   -  person user6592471    schedule 15.07.2016


Ответы (1)


У вас может быть задание, транслирующее событие в конце, к которому будет прикреплен слушатель. Затем этот слушатель отправит задание, чтобы выполнить работу снова.

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

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

person Ohgodwhy    schedule 15.07.2016