2016-07-15 68 views
0

我有一個需要不斷運行的隊列作業。讓隊列作業始終運行

這意味着當作業完成處理時,應該重新開始工作。

我該怎麼做?

這裏是我的工作:

<?php 

namespace App\Jobs; 

use App\User; 
use App\Post; 

use App\Jobs\Job; 
use Illuminate\Contracts\Mail\Mailer; 
use Illuminate\Queue\SerializesModels; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Queue\ShouldQueue; 

class PostJob extends Job implements ShouldQueue 
{ 
    use InteractsWithQueue, SerializesModels; 

    protected $user; 

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

    public function handle() 
    { 
     $posts = Post::where('user_id', $this->user->id) 
      ->get(); 

     foreach ($posts as $post) { 
      // perform actions 
     } 
    } 
} 

這裏的工作控制:

<?php 

namespace App\Http\Controllers; 

use App\User; 

use Illuminate\Http\Request; 
use App\Jobs\SendReminderEmail; 
use App\Http\Controllers\Controller; 

class UserController extends Controller 
{ 
    public function startPostJob(Request $request, $id) 
    { 
     $users = User::all(); 

     foreach ($users as $user) { 
      $this->dispatch(new PostJob($user)); 
     } 
    } 
} 
+0

您可以在執行作業後拋出異常並將其釋放回隊列中。但是,只會重試應用程序允許的最大嘗試次數。 – swatkins

+0

您是否在答案中找到了任何幫助@ user6592471 –

回答

0

的隊列意味着一個時代的要求,而不是連續作業運行。您的架構應該可能轉向更多的cron作業設置,以便您可以設置時間間隔以重新運行所需的代碼。

看一看任務調度文檔這裏https://laravel.com/docs/5.1/scheduling

+0

該隊列旨在使Web請求以imediatly方式執行,並讓更難的處理作業在後臺運行,而不是說無限的隊列作業是一個好主意,但隊列更多一個異步腳本執行器imo。 –

0

永遠運行工作,聽起來不像是個好主意,主要是因爲它很容易導致大量的CPU功率的使用。但是我已經完成了工作鏈,我以某種方式實現了工作,我認爲這可以幫助您解決問題。

我平時所做的,就是製作一個模型專用工作的責任,模型的責任。這將使從工作中調用起來更容易。

public class User{ 
    use DispatchesJobs; //must use, for dispatching jobs 

    ... 

    public function startJob() 
    { 
     $this->dispatch(new PostJob($this)); 
    } 
} 

這會給你在工作結束後把工作連在一起的可能性。請記住在完成後刪除作業。並且會一直持續下去,每次創造一份新工作。

public function handle() 
{ 

    ... 

    foreach ($posts as $post) { 
     // perform actions 
    } 

    $this->user->startJob(); 

    $this->delete(); 
}