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

現在我們有一個完整的端到端。一旦工作完成,它將播出一個事件。監聽者一旦被觸發就會收到事件。聽衆將再次派遣工作,傳遞給用戶。