我有一个需要不断运行的队列作业。
这意味着当作业完成处理时,它应该重新开始作业。
我该怎么做?
这是我的工作:
<?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 :(得分:0)
队列用于一次性请求,而不是连续的作业运行。您的架构可能应该转移到更多的cron作业设置,以便您可以设置间隔以重新运行所需的代码。
在这里查看任务计划文档https://laravel.com/docs/5.1/scheduling
答案 1 :(得分:0)
永远运行的Job,听起来不是最好的主意,主要是因为它很容易导致使用大量的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();
}