Home > Enterprise >  Limit Queued Job in Laravel
Limit Queued Job in Laravel

Time:04-12

I have an email service that allows me to send only 60 emails per hour (1/minute). So that is why i m trying to write an application that respect the service provider's restrictions, I m dispatching emails to bulk users at once via queue jobs,Please take a look at the code

    public function sendEmails(CreateEmailRequest $request)
{
    $data = [];
    $users = User::find($request->to);
    $subject = $request->subject;
    $body = $this->fileUpload($request->body);
    foreach ($users as  $user) {
        $vars = array(
            "{{name}}" => $user->name,
            "{{email}}" => $user->email,
        );
        $body = strtr($body, $vars);
        $data['body'] =  $body;
        $data['user'] =  $user;
        $data['subject'] =  $subject;
        dispatch(new SendEmailJob($data))->onQueue('mail');
    }


    Flash::success('Email sent successfully.');

    return redirect(route('emails.index'));
}

here is SendEmailJob Class code

 public function handle()
{
    $data = $this->data;
    $body = $data['body'];
    $user = $data['user'];
    $subject = $data['subject'];
    // list($body, $user, $subject) = $this->data;
    Mail::send('mail.email', ['body' => $body], function ($m) use ($user, $subject) {
        $m->to($user->email)->subject($subject);
    });
}
public function middleware()
{
    return Limit::perMinute(1);
}

when I run php artisan queue:work it process all jobs at once.. can you please tell me how can I achieve this? I can not use spatie/laravel-rate-limited-job-middleware because my server does not support Redis. Can you please tell me i m doing wrong ?

CodePudding user response:

You can use Job Middleware with a rate limiting

in the boot method of your AppServiceProvider

RateLimiter::for('emails', function($job) {
    return Limit::perMinute(1);
});

and add middleware to the job:

use Illuminate\Queue\Middleware\RateLimited;

public function middleware()
{
    return [new RateLimited('emails')];
}
  • Related