您可以讓作業在結尾處廣播一個將附加偵聽器的事件。這個聽衆然後會派遣一份工作再次完成這項工作。
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',
],
];
現在我們有一個完整的端到端。一旦工作完成,它將播出一個事件。監聽者一旦被觸發就會收到事件。聽衆將再次派遣工作,傳遞給用戶。
通常,隊列作業旨在處理後臺中長時間運行的進程。一些常見的隊列作業的例子是文件上傳或視頻編碼等。我很好奇:爲什麼你認爲你需要排隊作業來處理檢索郵件記錄?更進一步,你爲什麼要讓隊列永久運行?你能再描述一下你的用例嗎? – maiorano84
我在每個用戶的帖子上執行操作,我需要不斷地執行此操作。知道用戶列表非常短,帖子數量很少。 – user6592471