让队列作业始终运行

时间:2016-07-15 17:32:32

标签: laravel laravel-5 queue laravel-5.2 beanstalkd

我有一个需要不断运行的队列作业。

这意味着当作业完成处理时,它应该重新开始作业。

我该怎么做?

这是我的工作:

<?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));
        }
    }
}

2 个答案:

答案 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();
}